1

ネストされたモデルとフォーム フィールドのコンテキストでは、親の作成と子の値 (サイズ) の入力時に、子の値に条件を適用して後続の値 (product_id) を決定することが目標です。親アクションの

class QuoteItem < ActiveRecord::Base
  belongs_to :quote, :inverse_of => :quote_items
  belongs_to :product

class Quote < ActiveRecord::Base
  has_many   :quote_items, :inverse_of => :quote

モデルにはパラメーターの概念がないため、これを事前にモデル メソッドとして実行することはできません。QuoteItem の after_create コールバックを定義しようとしています

  after_create :set_product 
  def set_product
    @quote_item.product_id = Product.where(['min <= ? AND max >= ?', @quote_item.size, @quote_item.size]).first.select[:id]    
  end

商品IDを登録しません。

より簡潔な方法は、コントローラーを介してデータをリロードすることです。アクション作成時

   respond_to do |format|
      if @quote_item.save
        set_product
        @quote_item.update_attribute([:quote_item][:product_id])
        format.html { redirect_to @quote_item, notice: 'Quote item was successfully created.' }

同一の NIL 結果

4

1 に答える 1

2

実際に after_create で解決できます。ネストされたモデルでは、作成後に属性を更新します

  after_create :set_product  

private

  def set_product
    product_id = Product.where(['min <= ? AND max >= ?', self.size, self.size]).first.id
    update_attributes(:product_id => product_id)
  end
于 2013-05-25T21:21:04.093 に答える