2011-05-26 21 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

相關問題