0

デザイナーが作成したデザインをアップロードできるデザイン モデルがあります。同じデザイナーがアップロードした同じタイトルのデザインを照会し、それらをグループ化したいと考えています。

これをどのように行うかについて頭を悩ませることができません。提案はありますか?

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

たくさんのデザインをアップロードできるデザイナーがいます。彼が同じタイトルのデザインをアップロードする場合は、それらをグループ化する必要があります (配列内に配列を作成するのが最善の方法だと思います)。データベースでこれを照会する方法がわかりません。何か案は?

編集

これに似たものが必要だと思います:

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

これにより、すべての重複タイトルの単一のインスタンスが得られるはずです。それができたら、それらのタイトルをクエリして、ネストされた配列などに入れることができます。

問題は、mongoid でこのクエリを作成する方法がわからないことです。

4

1 に答える 1

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
于 2012-05-15T17:19:45.317 に答える