1

私の Rails (3.2) アプリでは、Orderに多数の がありLineItemsます。ALineItemには がたくさんありLineItemPaymentsます。ALineItemPaymentは 1 つ持っていPaymentます。(LineItems潜在的に複数回支払うことができます (サブスクリプション)。そのため、そこに結合テーブルがあります。)

支払い記録から注文情報を照会できる必要があります。リレーションシップを介して注文の配列を取得できますが、常に同じ順序になることはわかっています。これを反映するように関連付けを設定する方法は Rails にありますか? そうでない場合は、配列を取得してそこから注文を選択する方法を設定するかorder_id、支払いとともに保存して、これらすべてを回避する直接的な関係を設定する方がよいでしょうか?

4

1 に答える 1

3

注文コレクションを操作し、独自のロジックに応じて絞り込む必要があります。確かに order_id を支払いに直接追加することはできますが、これはデータを (キャッシュとして) 非正規化します。これは、クエリでパフォーマンスのボトルネックにぶつかり始めた場合にのみ推奨されます。そうしないと、データの整合性の領域で問題が発生します。

class Payment < ActiveRecord::Base
  has_many :line_item_payments
  has_many :line_items, :through => :line_item_payments
  has_many :orders, :through => :line_items

  # use this to get the order quickly
  def order
    orders.first
  end

  # use this to narrow the scope on the query interface for additional modifications
  def single_order
    orders.limit(1)
  end
end

class LineItemPayment < ActiveRecord::Base
  belongs_to :line_item
  belongs_to :payment
end

class LineItem < ActiveRecord::Base
  belongs_to :order
  has_many :line_item_payments
end
于 2013-01-28T20:44:28.947 に答える