【发布时间】:2016-12-19 12:29:56
【问题描述】:
我有两个模型:Customer 和 Order。有时会发生两个客户实际上是同一个客户,这由其中一个具有指向另一个客户记录的master_id 表示。在为客户获取订单时,我还想从奴隶客户那里获取订单(即声称我要查询的客户是他们的主客户记录的客户)。
所以:
Customer1: id: 1, master_id: nil, orders: [Order1, Order2]
Customer2: id: 2, master_id: 1, orders: [Order3]
查询 Customer1.all_orders 应该返回所有 3 个 Order 对象
我知道如何通过一种方法来做到这一点 - 提取奴隶客户的 id,将原始客户的 id 添加到数组中,然后查找 customer_id 在此数组中的订单:
has_many :slave_records, class_name: 'Customer', foreign_key: 'master_id'
def all_orders
order_ids = slave_records.map(&:id).push(id)
Order.where(customer_id: order_ids)
end
但是有没有办法使用范围和关系来做到这一点?它是 Rails 4(我知道 Rails 5 应该在它的 ActiveRecord 版本中有一个 OR 的东西)。
【问题讨论】:
-
如果您能粘贴您目前已实现的部分代码,将会很有帮助
-
@usmanali 我已经添加了我已经实现的方法 - 我想使用范围和关系来实现它
-
你能试试这个
scope: :all_orders -> { [orders, slave_records.map(&:orders)].flatten }吗? -
@31piy 这不起作用,因为范围 - 就像你提到的那样 - 适用于关系,而不是单个对象,因此在这种情况下 customer_1.all_orders 返回错误
undefined methodall_orders' for #`
标签: mysql ruby-on-rails activerecord