0

私は API を書いており、1 つの投稿の一部として作成される 2 つのモデルがOrderありLineItemます。私のAPIは(理想的には)この形式のデータを期待しています:

{
    "name": "Test Name",
    "date": "2013/01/01",
    "items": [{
        "name": "Item One",
        "quantity": 10
    }, {
        "name": "Item Two",
        "quantity": 30
    }]
}

上記の例では、「name」と「date」はOrderモデルのプロパティであり、「items」配列の各エントリはLineItem. 私の2つのモデルは次のように定義されています:

class Order < ActiveRecord::Base
    has_many :line_items
end

class LineItem < ActiveRecord::Base
    belongs_to :order

    validates :name, :uniqueness => {:scope => :order_id }
end

そのため、各項目はオーダーに対して一意である必要があります。アイテムを作成するためにこの POST リクエストを受け取ると、を保存するLineItemsまでの一意性を適切に検証できないようです。ただし、検証に失敗した場合は、システムに保存したくない注文を保存したことになります。OrderLineItem

このような状況を処理する適切な方法は何ですか?

4

1 に答える 1

1

あなたが探しているのは、Order.valid? と呼ばれます。これは validates_associated で行うことができます:

class Order < ActiveRecord::Base
  has_many :line_items
  validates_associated :line_items
end

これにより、明細の検証も呼び出されます。詳細については、次を参照してください。

http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

編集

コメントで指摘されているように、現在開いているバグにより、検証が失敗するのを防いでいるようです (ただし、重複した line_item はディスクに保存されません)。見る:

このバグを回避するには、新しいアイテムの名前の一意性を検証する before_validation コールバックを作成することをお勧めします。バグが修正されたら、このコールバックを削除できます。

于 2013-02-10T18:48:28.417 に答える