2011-05-26 38 views
3

想知道升级到Arel时,如果ActiveRecord支持自动方式从连接表中选择列,而不必在select子句中显式列出它们。自动化的方式来选择在ActiveRecord连接表的所有列?

鉴于我加入usersposts,想能够做这样的事情在一个更简洁的方式:

scope :select_user, 
    select("posts.*, " + User.columns.map{|c| 
     "users.#{c.name} user_#{c.name}"}.join(',')) 

所以,我要自动选择从用户的字段,以便我得到说

Post.joins(:user).select_user.first.user_name 

回答

1

如果我正确理解你的问题,你可以用“加入”做到这一点:

class Post < ActiveRecord::Base 
    belongs_to :user 

    scope :select_user, joins(:user).where('users.name = "Mary"') 
    ... 
end 

或设置了一个param:

class Post < ActiveRecord::Base 
    belongs_to :user 

    scope :select_user, lambda {|user_name| 
    joins(:user).where('users.name = ?', user_name) 
    } 
    ... 
end 
+1

感谢您的回答。我没有显示连接 - 问题更多的是关于如何自动选择连接表中的字段。 – aceofspades 2011-05-26 22:49:55

3

我想到你居然想在这里什么是使用includes,如果你想查询完成后访问该协会的属性。因此同样的查询将

Post.includes(:user).first.user.name 

这将导致两个查询,一个select * from users和一个select * from posts where posts.user_id in (id1, id2, id3...)(假设post belongs_to user),这可能是在特定情况下性能损失,但可能是值得的,从语法的角度来看。在某些情况下,它甚至可能更快Rails :include vs. :joins

如果您向查询添加限制运算符,Arel也将智能地使用join,例如, Post.includes(:user).where('users.name = "Bo Bob"')将使用join执行一个查询,并使您能够使用生成的Post对象上的关联。

+0

https://github.com/ntalbott/query_trace在开发时非常有用,可以查看每个rails命令生成的sql查询。 – sguha 2012-05-24 23:51:32

+0

我的问题实际上是如何选择所有加入的帖子和用户的字段,以及一些字段名称是相同的。 post.name和user.name – wizztjh 2012-05-25 04:57:57