我有三个表,Show
,Episode
和Character
。每个节目都有很多剧集和角色。
class Show < ActiveRecord::Base
has_many :episodes
has_many :characters
class Episode < ActiveRecord::Base
belongs_to :show
class Character < ActiveRecord::Base
belongs_to :show
我有一个角色列表。我想要做的是在他们的节目的第二集播出的日期之前订购它们。剧集有一个名为:air_date
所以我必须做一个两级连接表,比如:
@characters = Character.joins(:show)
.joins(:episodes)
.where(episodes: {number: 2})
.order(:air_date)
但ActiveRecord认为我正在寻找与角色相关的剧集,当然这种联想并不存在。
如何返回与字符列表相关联的节目相关的剧集?或者甚至可能吗?
答案 0 :(得分:1)
您应该使用此语法(我假设air_date
是episodes
的属性):
Character.joins(show: :episodes)
.where(episodes: {number: 2})
.order('episodes.air_date ASC')
你也应该能够使用AREL:
Character.joins(show: :episodes)
.where(episodes: {number: 2})
.order(Episode.arel_table[:air_date].asc)
如果您要将所有内容加载到内存中,可以使用includes
,preload
或eager_load
代替joins
可以找到完整的解释和示例here。
答案 1 :(得分:0)
@character = Character.find x
@shows = @character.show.where(episodes: {number: 2}).order(:air_date).joins(:episodes)
完全未经测试 - 我记得一个ActiveRecord查询我看到一些时间将连接放在最后。这是一个类似的用例(只获得符合特定条件的x
条记录。)