ActiveRecord通过范围从has_many和相关关系中获取记录

时间:2016-12-19 12:29:57

标签: mysql ruby-on-rails activerecord

我有两个模型:CustomerOrder。有时会发生两个客户实际上是同一个客户,其中一个客户的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的东西)。

1 个答案:

答案 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。但是,您将能够以更清洁的方式获得所有结果。