我有三个模型,Model
,ModelType
和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
将返回与ModelType
关联的model1
个对象数组。 models
可能与多个model_types
或model_categories
。
我希望能够选择一个随机Model
,使其为type1
和category1
。
我在选择Model
type1
时取得了一些成功,但之后我陷入困境。这是我选择的代码:
ModelType.find_by_name("type1").models.find(:first, :order => "Random()")
注意:model_type1.models
会返回Model
type1
个{{1}}个对象的数组。
答案 0 :(得分: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,因此您可以按此过滤。