【发布时间】:2010-11-27 15:03:41
【问题描述】:
我正在尝试连接两个表并返回所有列,而不仅仅是与模型关联的列。
我有类似这样的东西:
Comment.joins(:user).select("*")
SQL 看起来不错,但它仍然只返回 cmets,没有任何与之关联的用户信息。
如何检索* 而不仅仅是comments.*?
【问题讨论】:
标签: ruby-on-rails join arel
我正在尝试连接两个表并返回所有列,而不仅仅是与模型关联的列。
我有类似这样的东西:
Comment.joins(:user).select("*")
SQL 看起来不错,但它仍然只返回 cmets,没有任何与之关联的用户信息。
如何检索* 而不仅仅是comments.*?
【问题讨论】:
标签: ruby-on-rails join arel
怎么样
comments = Comment.includes(:user).all
现在comments 将成为一个数组,因此您必须遍历它才能查看所有用户。
#won't work
comments.user
#should work
comments[0].user
comments.each do |comment|
puts comment.user.name #or whatever
end
【讨论】:
这应该可行:
comments = Comment.joins(:user).includes(:user)
但这是我认为正在发生的事情,如果您在控制台窗口中查看输出,我认为控制台输出仅反映/检查返回的根级别对象。
我刚刚做了一个实验,我执行了上面的代码。终端输出记录它获取了 cmets,但没有提及关联的用户。接下来,我关闭了数据库,以便无法对数据库执行第二个查询,然后询问关联的用户,例如
comments.user
控制台输出用户,证明已经被热切加载,因为没有尝试连接数据库。
【讨论】:
comments.user 时是否会触发查询。
Comment.select('*').includes(:user)
【讨论】:
Ryan Bates 对此主题有很好的教程。
http://railscasts.com/episodes/22-eager-loading-revised?autoplay=true
【讨论】: