【问题标题】:Is a double-level joins table possible?是否可以使用双层连接表?
【发布时间】:2016-02-05 21:57:27
【问题描述】:

我有三个表,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

我有一个角色列表。我想做的是在他们的节目第二集播出的日期之前订购它们。 Episode 有一个唯一命名的属性,称为 :air_date

所以我必须做一个两级连接表,比如:

@characters = Character.joins(:show)
                       .joins(:episodes)
                       .where(episodes: {number: 2})
                       .order(:air_date)

但是 ActiveRecord 认为我正在寻找与 Characters 相关的 Episodes,当然这种关联并不存在。

如何返回与角色列表相关联的剧集相关联的剧集?或者这甚至可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby join activerecord


    【解决方案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找到。

    【讨论】:

    • 我收到此错误:ArgumentError: Direction should be :asc or :desc.
    • 抱歉,语法错误。我确定了答案。请重试
    【解决方案2】:
    @character = Character.find x
    @shows = @character.show.where(episodes: {number: 2}).order(:air_date).joins(:episodes)
    

    完全未经测试 - 我记得前段时间看到的一个 ActiveRecord 查询,它把连接放在最后。这是一个类似的用例(仅获取满足特定条件的 x 记录)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多