是否可以使用双级联接表?

时间:2015-11-05 06:48:01

标签: ruby-on-rails ruby join activerecord

我有三个表,ShowEpisodeCharacter。每个节目都有很多剧集和角色。

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认为我正在寻找与角色相关的剧集,当然这种联想并不存在。

如何返回与字符列表相关联的节目相关的剧集?或者甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您应该使用此语法(我假设air_dateepisodes的属性):

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)

如果您要将所有内容加载到内存中,可以使用includespreloadeager_load代替joins

可以找到完整的解释和示例here

答案 1 :(得分:0)

@character = Character.find x
@shows = @character.show.where(episodes: {number: 2}).order(:air_date).joins(:episodes)

完全未经测试 - 我记得一个ActiveRecord查询我看到一些时间将连接放在最后。这是一个类似的用例(只获得符合特定条件的x条记录。)