我正在做一个我正在使用自我加入一对多设置的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
现在我打开了我的rails控制台。我试着这样做:
user.customers.order_lists
我明白了:
NoMethodError: undefined method `order_lists'
当我尝试这样做的时候:
user.customers.first.order_lists
我收到该客户的订单清单。 但我怎么能收到所有客户的所有订单?
有人有想法吗?
答案 0 :(得分:1)
当你打电话时有很多关系:
user.customers
它返回用户“拥有”的所有客户的数组,因此当您调用
时user.customers.order_lists
正在为一系列客户调用 order_lists
。 (没有方法order_lists
)。第一种方法为您提供阵列中的第一个客户,以便它可以工作。你也可以这样做:
user.customers[0].order_lists
如果你想要的话。 (虽然先使用更好)
获取所有客户的order_lists将遍历所有客户并获得它们。
答案 1 :(得分:1)
所以你想要所有与用户相关的客户的所有order_lists?
这样可以解决问题:
user.customers.map(&:order_lists).flatten
或者您可以在OrderList上创建一个范围,它采用一组customer_id,如下所示:
scope :for_customer_ids, ->(customer_ids) {
where("user_id IN (?)", customer_ids)
}
然后
OrderList.for_customer_ids(user.customer_ids)