2013-04-15 54 views
0

編輯我的問題是更具體關於我在問什麼。Rails - 是否有更好的替代方案來收集?

我有嵌套關聯在我的數據,我渴望加載,然後想要使用收集做一些子處理。所以說我有帖子,有評論擁有所有者屬性。所以我做

Post.includes(:comments).collect(&:owner) 

..然後做一些東西與業主。有沒有更好的方法來抓住業主?

+1

'all'返回每個記錄,然後你使用'collect'過濾 - 即'Model.where - where'嘗試使用ActiveRecord'(:some_attr =>真)' – house9

+0

@ house9感謝我已經編輯我的問題 – absolutskyy

回答

1

嘗試Activerecord::Base#select

Model.today.select([:attr1, :attr2, :attr3]) # chainable method 
# will generate this query 
# SELECT attr1, attr2, attr3 FROM models 
+0

請注意,這將返回僅具有所選列的屬性值的「MyModel」實例。如果'MyModel'有一個'id','name'和'date',並且你做了'MyModel.select(:name)',你返回的所有實例看起來就像'#,等等'。如果您嘗試訪問其他屬性,它將返回爲零。 – MrDanA

+1

我應該補充一點,這意味着你的數據庫查詢更快,因爲它選擇的次數更少,但是如果你想要一個包含所有名字的Ruby數組(例如),你仍然必須使用'collect'來抓取它們。 – MrDanA

+0

其實,我認爲這是問題的目的。當你只需要名字時,從胖表中獲取所有列的速度並不像它那樣快。 – nicooga

2

您是否在尋找pluck

Client.where(:active => true).pluck(:id) 
# SELECT id FROM clients WHERE active = 1 

Client.uniq.pluck(:role) 
# SELECT DISTINCT role FROM clients 
+0

請注意,pluck在所有Rails版本上都不可用。 – MrDanA

0

的Rails的工作,你想要什麼,如果你添加一個has_many_through關聯。

class Post < ActiveRecord::Base 
    has_many :comments 
    has_many :commenters, through: :comments, source: :owner 
    ... 
end 

male_gardeners = Post.find_by(slug: 'in_the_garden').commenters.where(gender: 'M') 
相關問題