2016-12-19 15 views
0

私はCustomerOrderという2つのモデルを持っています。場合によっては、2人の顧客が実際に同じ顧客であり、そのうちの1つがmaster_idという別の顧客レコードを指していることが示されます。顧客のオーダーを取得するときは、スレーブのお客様(つまり、私が照会している顧客が主な顧客レコードであると主張している顧客)からオーダーをフェッチしたいと考えています。ActiveRecordはhas_manyからレコードを取得し、スコープを通じて関連関係を取得します

ので:

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

これまでに実装したコードの一部を貼り付けることができれば助かります – usmanali

+0

@usmanali私は既に実装したメソッドを追加しました - これをスコープとリレーションを使って実装したい – Piaskal

+0

このスコープを試してください::all_orders - > {[orders、slave_records.map(&:orders)]。flatten} '? – 31piy

答えて

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に電話をかけることはできません。しかし、すべての結果をよりクリーンな方法で得ることができます。

関連する問題