【问题标题】:Ruby on rails activerecord joins - select fields from multiple tablesRuby on rails activerecord 连接 - 从多个表中选择字段
【发布时间】:2011-08-06 10:51:11
【问题描述】:

型号:

#StatusMessage model
class StatusMessage < ActiveRecord::Base
  belongs_to :users
  default_scope :order => "created_at DESC"
end


#User Model
class User < ActiveRecord::Base
  has_many :status_messages 
end

在控制器中,我想加入这两个表并从两个表中获取字段。例如,我想要来自Useremail 字段和来自StatusMessagestatus 字段。当我使用:

@status = User.joins(:status_messages)

或者

@status = User.includes(:status_messages)

它只给我用户表数据。

我该如何实现这个要求?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord join


    【解决方案1】:

    您需要在这里使用includes。它会预加载数据,因此您在执行@user.status_messages 时不会有另一个 SQL 查询。

    是的,你看不到效果:你需要检查你的日志。

    【讨论】:

      【解决方案2】:

      首先,我认为您想要做的事情是不可能的(并且是合理的)。原因是UserStatusMessage 之间的关系是1:n,这意味着每个用户可以有0 到n 条状态消息。应该如何将这些众多属性包含在您的用户模型中?

      我认为 ActiceRecord 类中的方法joints 有不同的含义,它是query interface 的一部分。见问题LEFT OUTER joins in Rails 3

      网上也有类似的问题,这里是我发现最匹配的:

      • Ruby on Rails: How to join two tables:在用户中包含(为您的示例翻译)primary_status_message,然后在用户的查询中具体化。但它保存在一个属性中,要访问 status_message 的属性,您必须执行以下操作:@user.primary_status_message.status

      【讨论】:

        【解决方案3】:

        当您使用@status = User.includes(:status_messages) 时,rails eagerley 会加载所有表的数据。

        我的意思是当你使用这个 User.includes(:status_messages) 时,它也会加载 status_messages 的数据,但只显示用户表数据,如果你想要第一个用户 status_messages 那么你必须@user.first.status_messages

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 2020-03-22
          • 2011-05-10
          相关资源
          最近更新 更多