【问题标题】:Ruby on Rails Active Record inner join not workingRuby on Rails Active Record 内部连接不起作用
【发布时间】:2016-01-20 15:35:01
【问题描述】:

我有 2 个模型:参与度、用户。参与度基本上是指用户预订的项目。每个参与都是针对特定用户的。参与的用户有一个外键。我想加入与用户的互动,以便我可以看到用户的详细信息。

这是我的模型

class Engagement < ActiveRecord::Base
  belongs_to :food_item  
  belongs_to :user
end
class User < ActiveRecord::Base
    has_many :engagements
    has_many :food_item, through: :engagements
end

我正在运行以下查询:

Engagement.joins("INNER JOIN users ON users.id = engagements.user_id")

它没有加入两个表。

任何帮助将不胜感激

【问题讨论】:

  • 它不产生什么sql?
  • 您是否收到错误消息?如果可以,可以分享一下吗?
  • 只是一个评论,Rails 默认使用内连接,所以你可以做 Engagement.joins(:user)
  • 他感谢您的及时回复,我没有从查询中收到任何错误消息,但问题是我也没有获得用户信息。
  • @marcelo 您提到的查询也给我带来了相同的结果。无论如何感谢您的建议

标签: sql ruby-on-rails activerecord ruby-on-rails-3.1


【解决方案1】:

您的查询是正确的。 您正在执行内部联接,并且只返回与用户相关的参与。

要返回用户数据,您应该执行以下操作:Engagement.select('tasks.*, users.*').joins(:user)。这样,对象将具有参与度和用户属性。但这不是 Rails 的方式。

“正确”的方式是:

engagements = Engagement.includes(:user)
engagements.first.user # this will return the user data

这样您可以获得所有参与并预加载用户数据,这样可以避免 n + 1 次查询 (Eager-loading) ;)

【讨论】:

    【解决方案2】:

    试试这个Engagement.joins(:users)

    它应该可以工作。

    【讨论】:

    • @giovani 上面的查询也没有获取用户数据。它给了我与我在问题中提到的查询相同的结果
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2010-12-06
    相关资源
    最近更新 更多