2012-05-06 7 views
0

私はModel,ModelType、およびModelCategoryという3つのモデルを持っています。それらは、ModelTypeRelationshipModelCategoryRelationshipのような関連テーブルを介して互いに接続されています。Rails - 2つの独立した関連条件に一致するモデルを選択してください

# 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.typemodel1に関連付けられているModelTypeオブジェクトの配列を返します。 modelsは、複数のmodel_typesまたはmodel_categoriesに関連付けられている可能性があります。

ランダムModelを選択して、type1category1となるようにしたいと考えています。

type1Modelを選択するといくつかの成功を収めましたが、それ以降は固まってしまいました。ここではその選択のための私のコードは次のとおりです。

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

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

答えて

1

まず、あなたのModelTypeとにスコープを追加ModelCategoryモデル:

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

:それは代わりに、モデルクラスからクエリを開始するには自然なことですので、あなたは、「モデル」を選択します

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

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

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

Obs:私はそのModelTyと推定していますpeとModelCategoryは属性nameを持っているので、それをフィルタリングすることができます。

+0

完全に働いた - ありがとう!興味のある人は、 'lambda'と' arel_table [] 'の研究をするときに役立つRailsCastを見つけました:http://railscasts.com/episodes/215-advanced-queries-in-rails-3 – Nick

+0

また、ランダム元の質問に記載されている 'find(:first、:order =>" Random() ")'を追加しました。 – Nick

関連する問題