如何通过Rails中的HABTM查询belongs_to

时间:2014-07-14 19:15:32

标签: ruby-on-rails ruby activerecord has-and-belongs-to-many

我正在尝试了解查询非常基本的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

感谢。

2 个答案:

答案 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渴望一次加载所有比赛,而不是每个事件类型加载一个。