【问题标题】:Rails - Active Record Join across 3 TablesRails - 跨 3 个表的 Active Record 连接
【发布时间】:2015-10-22 22:49:09
【问题描述】:

对 Rails 有点陌生,所以如果你们能提供任何帮助,我将不胜感激。

无论如何,我有三个模型 - Vote、Lunch 和 Provider,我希望编写一个单独的 Active Record 调用来拉取:

  • 投票表中的所有数据
  • 午餐桌上的午餐日期
  • Provider 表中的 Provider 名称

投票模型包含一个lunch_id,午餐模型包含一个lunch_id(简称id)和provider_id。 Provider 模型有一个 provider_id(只是称为 id)。在 Rails 控制台中,我可以这样写:

v = Vote.joins(:lunch).select("lunches.date,votes.*").where(lunch_id: 1)

输出投票模型中的所有数据,以及午餐模型中的相关日期。我卡住的地方是我不知道如何“嵌套”它然后加入 Provider 模型。

我认为这可能与“has_many_through”有关,但即使在阅读了文档之后,我也不确定它是如何实现的。这里的任何想法将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord rails-activerecord


    【解决方案1】:

    假设您的所有模型都定义了正确的 has_manybelongs_to 关联,您可以通过将散列传递给 join 方法而不只是符号来连接多个表。

    Vote.joins(lunch: :provider).select('lunches.date, providers.name, votes.*').where(lunch_id: 1)
    

    有关这些的更多信息,请参阅 rails 查询接口文档的“使用命名关联的数组/哈希”部分。

    http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associations

    【讨论】:

    • 这就像一个魅力。如果您有第四个表,那么语法会是什么,哈希仍然可以工作,因为您现在可能有三个 id 要加入,而不仅仅是两个?另外,在散列中,:provider 是一个符号,但“午餐:”指的是什么?它总是让我在 Rails 中来回切换冒号。
    • 使用类似lunch: :provider的东西是{ :lunch => :provider }的快捷语法,它仅仅意味着:lunch是一个值为:provider的键,同时也是一个符号本身。如果您要连接更多的表,您可以通过提供嵌套哈希来实现,例如joins(table1: { table2: { table3: :table4 } })。我已经使用 Rails 文档的链接更新了答案,其中包含这些技术的其他示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多