Ruby on rails activerecord join - 从多个表中选择字段

时间:2011-08-06 10:51:12

标签: ruby-on-rails ruby activerecord join

模型:

#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

在控制器中我想加入这两个表并从两个表中获取字段。例如,我希望来自email的{​​{1}}字段和来自User的{​​{1}}字段。当我使用时:

status

或者

StatusMessage

它只给我用户表数据。

如何实施此要求?

3 个答案:

答案 0 :(得分:6)

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

是的,你无法真正看到效果:你需要检查你的日志。

答案 1 :(得分: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

答案 2 :(得分:1)

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

我的观点是,当您使用此User.includes(:status_messages)时,它还会加载status_messages的数据,但只显示用户表数据,那么如果您想要第一个用户status_messages,则必须使用@ user.first.status_messages