2015-04-28 18 views
1

下面的問題有一個很好的答案,使用Comment.includes(:user)在一次命中中獲取activerecord集合的關聯值。當你想要一次抓取多個關聯時,怎麼樣?Rails有ActiveRecord一次抓取多個關聯?

Rails have activerecord grab all needed associations in one go?

是隻這些連鎖在一起,就像下面Customer.includes(:user).includes(:sales).includes(:prices)最好的辦法還是有一個更清潔的方式。

此外,當我在一個索引表的循環上這樣做。我可以添加在customer.rb模型的方法,這樣我可以打電話@customers.table_includes等,並有

def table_includes 
    self.includes(:user).includes(:sales).includes(:prices) 
end 

爲了記錄我測試上面,並沒有因爲它的工作方法上的集合(還沒搞清楚這個怎麼做)。

回答

1

在回答這個,我假設usersalesprices是關閉的Customer所有關聯。

取而代之的鏈接,你可以做這樣的事情:

Customer.includes(:user, :sales, :prices) 

在創建這個抽象的方面,你有一對夫婦的選擇。

首先,你可以創建一個範圍:

class Customer < ActiveRecord::Base 
    scope :table_includes, -> { includes(:user, :sales, :prices) } 
end 

或者,如果你想爲它是一個方法,你應該考慮它,而不是一個實例級一類級別的方法:

def self.table_includes 
    self.includes(:user, :sales, :prices) 
end 

雖然我會考慮創建這個抽象的目的。長期來看,像table_includes這樣的通用名稱可能不會很友好。

+0

謝謝。我把它作爲一個範圍,並且工作得很好。我已經包含了,所以我沒有在每個循環中調用數據庫。似乎用'連接'它將回到查詢數據庫。有沒有一種方法可以同時加入幷包含在內,或者只是在範圍內鏈接? –

+0

對於你認爲表是activerecord與has_many和belongs_to關聯的假設'是' –

+0

到目前爲止使用'scope:table_includes, - > {joins(:user,:sales,:prices).includes(:user,:銷售,:價格)}'似乎工作,但不是很乾。希望有一件事我可以在一次通話中替代'joins'和'includes'。 –