2011-08-06 90 views
2

型号:Ruby on Rails的ActiveRecord的连接 - 选择字段从多个表

#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字段Userstatus字段StatusMessage。当我使用:

@status = User.joins(:status_messages) 

或者

@status = User.includes(:status_messages) 

它给我的只有用户表中的数据。

我该如何执行此要求?

回答

6

这里您需要使用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
1

当您使用@status = User.includes(:status_messages),然后轨eagerley加载所有表格的数据。我的观点是当你使用这个User.includes(:status_messages)它也会加载status_messages的数据,但只显示用户表数据,那么如果你想要第一个用户status_messages,那么你必须@ user.first.status_messages

相关问题