私はCustomer
とOrder
という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を持つはずでした)。
これまでに実装したコードの一部を貼り付けることができれば助かります – usmanali
@usmanali私は既に実装したメソッドを追加しました - これをスコープとリレーションを使って実装したい – Piaskal
このスコープを試してください::all_orders - > {[orders、slave_records.map(&:orders)]。flatten} '? – 31piy