2012-10-29 75 views
0

我正在做一個Rails項目,我正在使用自加入的一對多設置。自加入類的Rails協會

我有一個名爲User的類,它有許多客戶。 每個客戶有很多訂單列表,像這樣:

class User < ActiveRecord::Base 
    has_many :customers, class_name: 'User', foreign_key: 'owner_id' 
    belongs_to :owner, class_name: 'User' 
    has_many :order_lists, dependent: :destroy 

現在,當我睜開軌控制檯。我試着這樣做:

user.customers.order_lists 

我得到這個:

NoMethodError: undefined method `order_lists' 

而當我嘗試這樣做:

user.customers.first.order_lists 

我收到客戶的訂單列表。 但我怎麼能接受我所有客戶的所有訂單?

有人有想法嗎?

回答

1

因此,您希望所有與用戶關聯的客戶的所有order_lists?

這將這樣的伎倆:

user.customers.map(&:order_lists).flatten 

或者你可以做出OrderList的涵蓋範圍需要像這樣一組CUSTOMER_IDS的:

scope :for_customer_ids, ->(customer_ids) { 
    where("user_id IN (?)", customer_ids) 
} 

然後

OrderList.for_customer_ids(user.customer_ids) 
+0

這解決方案在控制檯中工作,但我想顯示我的訂單列表。所以當我想分頁時,這是行不通的。其他解決方案? – Niels

+0

我沒有看到以下解決方案:OrderList.find(user.customers.map(&:order_list_ids).flatten。這是建立在以前的答案 – Leito

+0

我認爲你可以在OrderList上編寫一個範圍以便使用分頁 – annalogarhythm

1

在有很多的關係,當你撥打:

user.customers 

返回所有的客戶用戶「擁有」的數組,所以當你調用

user.customers.order_lists 

order_lists被稱爲在一系列的客戶。 (它沒有方法order_lists)。第一種方法爲您提供陣列中的第一位客戶,這樣它就可以工作。你也可以這樣做:

user.customers[0].order_lists 

如果你想。 (使用第一個更好,雖然)

獲取所有客戶order_lists將循環所有客戶,並得到他們那樣。