我正在尝试了解查询非常基本的HABTM关系的最佳方法。我想找到相关学科的所有种族。由于我在中间有一个HABTM关系,我只是对最好的方法感到困惑。
class Discipline < ActiveRecord::Base
has_many :event_types
end
class EventType < ActiveRecord::Base
belongs_to :discipline
has_and_belongs_to_many :races
end
class Race < ActiveRecord::Base
has_and_belongs_to_many :event_types
end
感谢。
答案 0 :(得分:2)
您可以对已加入event_types的比赛进行查询,并使用where仅包含仅在subject_id正确的条目。
Race.joins(:event_types).where('event_types.discipline_id = ?', discipline.id)
这假设您已在变量discipline
中加载了规则...如果您在实例变量@discipline
中具有规则,则相应地更改查询的结尾。
答案 1 :(得分:0)
也许可以这样定义:
class Discipline < ActiveRecord::Base
has_many :event_types
has_many :races, through: :event_types
然后拨打discipline.races
。
如果没有,我认为,这应该有效:
discipline.event_types.includes(:races).map { |e| e.races }.flatten
map
返回一个新数组,其中包含每个结果的块结果,从而返回每个事件的比赛。 flatten
从嵌套数组(每个事件类型的比赛数组)中得到一个平坦的数组(只是比赛)。也许你也想打电话给uniq
。并且includes
渴望一次加载所有比赛,而不是每个事件类型加载一个。