我有两个模型: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的东西)。
答案 0 :(得分:0)
在订单模型中添加范围可以让您更接近您想要的。
class Order
scope :for_master, -> (master) { where("customer_id = #{master.id} OR customer_id IN (?)", master.slave_records.select(:id)) }
end
因此,对于任何主要客户,请致电范围,您也将获得儿童订单。
Order.for_master(customer)
您将无法拨打customer.all_orders
。但是,您将能够以更清洁的方式获得所有结果。