Rails与自我加入类的关联

时间:2012-10-29 19:46:35

标签: ruby-on-rails has-many self-join nomethoderror

我正在做一个我正在使用自我加入一对多设置的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

我收到该客户的订单清单。 但我怎么能收到所有客户的所有订单?

有人有想法吗?

2 个答案:

答案 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)