2012-05-13 12 views
0

私はデザイナーが彼らが作ったデザインをアップロードすることを可能にするデザインモデルを持っています。同じデザイナーがアップロードした同じタイトルのデザインをクエリしてグループ化したいと思います。mongoidに重複したタイトルのデザインを照会します

私はこれをどうやって行うのか頭がいっぱいです。あなたは提案がありますか?

私はRails 3.2、Ruby 1.9.3とMongoidを実行します。

さらに詳しい情報:

デザイナーモデル:

class Designer 
    has_many :designs, :order => "created_at" 
end 

デザインモデル:

class Design 
    belongs_to :designer 

    attr_accessible :image, :tags, :description, :title, :featured 

    mount_uploader :image, DesignerUploader 

    field :width 
    field :height 
    field :description 
    field :title 
    field :tags, type: Array 
    field :featured, :type => Boolean, :default => false 
end 

設計コントローラ:

def newest 
    @designs = Design.select("title, count(title) as title_count").group(:title).having("title_count > 1") 
end 

私は多くのデザインをアップロードできるデザイナーを持っています。同じタイトルのデザインをアップロードする場合は、一緒にグループ化する必要があります(これは配列内に配列を作成するための最良の方法だと思っています)。私はデータベースでこれをどのように問い合わせるのか分かりません。何か案は?

EDIT

私はこれと似たような必要があると思う:これは私のすべての重複タイトルの単一のインスタンスを与える必要があります

Design.find(:all, :group => [:title], :having => "count(*) > 1") 

を。私はそれを持っているとき、私はそれらのタイトルを照会し、それをネストされた配列またはそのようなものに入れることができます。

問題は、どのようにあなたがmongoidでこのクエリを作成できるかわかりません。

+0

なぜ私の質問をd​​ownvotingですか? –

+0

コードデザインのモデル(デザイナーは別モデルの場合)を見ることなく、手助けするのは難しいです... –

+0

詳細を提供してくださいますか?たとえば、デザインが同じデザイナーとタイトルを持っている場合、その違いは何ですか?読み込み時間またはバージョン?あなたは何をしようとしているのですか?あなたの質問はかなりスケッチであるように見えますが、詳細がわかりやすくなってくれます。 –

答えて

0

あなたのモデルはかなり不完全なので、モデルに近づこうとする試みとして、次の作業の解決策を受け入れてください。

class Designer 
    include Mongoid::Document 
    field :name, type: String 
    has_many :designs #, :order => "created_at" 
end 

class Design 
    include Mongoid::Document 
    belongs_to :designer 

    attr_accessible :image, :tags, :description, :title, :featured 

    #mount_uploader :image, DesignerUploader 

    field :width, type: Integer 
    field :height, type: Integer 
    field :description, type: String 
    field :title, type: String 
    field :tags, type: Array 
    field :featured, type: Boolean, default: false 
end 

class DesignsController < ApplicationController 
    def newest 
    @designer = Designer.where(name: params['name']).first 
    @designs = Design.where(designer_id: @designer._id).where(title: params['title']).to_a 
    render :text => <<-EOF 
     params: #{params.inspect} 
     designer: #{@designer.inspect} 
     designs by title: #{@designs.inspect}: 
    EOF 
    end 
end 

のconfig/routes.rbを

match ':controller/:action/:name/:title' 

テスト/ユニット/ designer_test.rb

require 'test_helper' 

class DesignerTest < ActiveSupport::TestCase 
    def setup 
    Designer.delete_all 
    Design.delete_all 
    end 

    test "designer designs" do 
    design_title = 'little black dress' 
    designer = Designer.create(name: 'Coco', designs: [ 
     Design.new(title: design_title, width: 300, height: 400), 
     Design.new(title: design_title, width: 600, height: 800), 
     Design.new(title: 'jersey traveling suit', width: 600, height: 800), 
    ]) 
    p designer 

    # finds designs with designer and title on server 
    designs = Design.where(designer_id: designer._id).where(title: design_title).to_a 
    assert_equal(2, designs.size) 
    p designs 

    # finds all designer's designs and selects locally 
    designs = designer.designs.select{|design| design['title'] == design_title} 
    assert_equal(2, designs.size) 
    p designs 
    end 
end 

試験/機能/ designs_controller_test.rb

require 'test_helper' 

class DesignsControllerTest < ActionController::TestCase 
    def setup 
    Designer.delete_all 
    Design.delete_all 
    end 

    test "newest" do 
    design_title = 'little black dress' 
    designer = Designer.create(name: 'Coco', designs: [ 
     Design.new(title: design_title, width: 300, height: 400), 
     Design.new(title: design_title, width: 600, height: 800), 
     Design.new(title: 'jersey traveling suit', width: 600, height: 800), 
    ]) 
    get :newest, :name => 'Coco', :title => design_title 
    assert_response :success 
    assert_equal('Coco', assigns(:designer).name) 
    assert_equal(2, assigns(:designs).size) 
    assigns(:designs).each do |design| 
     assert_equal(design_title, design.title) 
    end 
    puts @response.body 
    end 
end 

結果

Run options: --name=test_newest 

# Running tests: 

     params: {"name"=>"Coco", "title"=>"little black dress", "controller"=>"designs", "action"=>"newest"} 
     designer: #<Designer _id: 4fb28df8e4d30bd575000004, _type: nil, name: "Coco"> 
     designs by title: [#<Design _id: 4fb28df8e4d30bd575000001, _type: nil, designer_id: BSON::ObjectId('4fb28df8e4d30bd575000004'), width: nil, height: nil, description: nil, title: "little black dress", tags: nil, featured: false>, #<Design _id: 4fb28df8e4d30bd575000002, _type: nil, designer_id: BSON::ObjectId('4fb28df8e4d30bd575000004'), width: nil, height: nil, description: nil, title: "little black dress", tags: nil, featured: false>]: 
. 

Finished tests in 0.043330s, 23.0787 tests/s, 115.3935 assertions/s. 

1 tests, 5 assertions, 0 failures, 0 errors, 0 skips 
+0

答えてくれてありがとうゲーリー。これは、多くのOSテストで長い答えでした(テスト駆動開発にはまだ入っていないので、それを理解するのに少し時間がかかりました)。私はもう少し調べて、私は上記のようなものが必要だと思う。あなたはそれがモンゴイとどのようにできるのか知っていますか? –

+0

Test Driven Development(TDD)はRailsの標準です。 "rails g"を使ってモデルやコントローラを生成すると、テストファイルもすでに生成されています。上記のような例を見て、試してみてください。すぐにTDD、深い理解、そしてデバッグにかかる​​時間が大幅に減ります。 –

関連する問題