0

ModelModelType、およびの 3 つのモデルがありModelCategoryます。ModelTypeRelationshipこれらは、やなどの関連付けテーブルを介して相互に接続されていますModelCategoryRelationship

# app/models/model.rb
class Model < ActiveRecord::Base
  has_many :model_type_relationships, dependent: :destroy
  has_many :model_category_relationships, dependent: :destroy
  has_many :types, through: :model_type_relationships
  has_many :categories, through: :model_category_relationships
  ...
end

注:は、 に関連付けられているオブジェクトmodel1.typeの配列を返します。複数のまたはに関連付けることができます。ModelTypemodel1modelsmodel_typesmodel_categories

と のようなランダムを選択できるようにしたいとModel思いtype1ますcategory1

の を選択することにある程度成功していましたModeltype1、その後行き詰まりました。その選択のための私のコードは次のとおりです。

ModelType.find_by_name("type1").models.find(:first, :order => "Random()")

注:は のオブジェクトのmodel_type1.models配列を返します。Modeltype1

4

1 に答える 1

1

まず、ModelType および ModelCategory モデルにスコープを追加します。

scope :named, lambda { |name| where(arel_table[:name].eq(name)) }

「モデル」を選択したいので、代わりに Model クラスからクエリを開始するのが自然です。

Model.joins(:types).scoped.merge(ModelType.named("type1"))

そして最後に、その方法でスコープを組み合わせることができます:

Model.joins(:types, :categories).scoped.merge(ModelType.named("type1"))
  .scoped.merge(ModelCategory.named("category1"))

Obs: ModelType と ModelCategory には属性 :name があると推測しているので、それでフィルタリングできます。

于 2012-05-06T22:40:02.933 に答える