0

私はただ自分自身に尋ねています、私の問題に対する最善の解決策は何ですか.

ここに私のモデルがあります:

class Product < ActiveRecord::Base
  has_many :prices, :class_name => "ProductPrice"
  accepts_nested_attributes_for :prices
end

class ProductPrice < ActiveRecord::Base
  belongs_to :product
end

コントローラー

def create
  @product = Product.new(params[:product])

  @product.save
  ...
end

私がしたいのは、すべての ProductPrices が保存されないようにすることproduct_price.value == nilですproduct_price.value == 0.0

  1. before_saveProductPrice にフックします。return false トランザクション全体をロールバックしますが、それは私がやりたいことではありません。すべての価格を「キック」したいだけですvalue == 0 or value == nil
  2. 最初にすべてのprice_paramsをキックし、params[...]それよりも呼び出しProduct.new(params[:product])がレールウェイエイターではないようです...
  3. Product.new(params[:product])すべての価格を繰り返し処理し、配列から削除した後。しかし、ロジックは私のモデルにあるはずですよね? 新しい価格を作成するすべてのコントローラーで同じことを繰り返したくありません...

誰かがそのための最良の解決策を教えてもらえますか? レールウェイは?

ありがとう!

4

1 に答える 1

0

必要なものは、次のような検証フックと呼ばれます。

class ProductPrice < ActiveRecord::Base
  belongs_to :product

  validates :value, :numericality => {:greater_than => 0.0 }
end

より細かい制御でこれを行う他の方法については、http: //guides.rubyonrails.org/active_record_validations_callbacks.htmlを参照してください。

そもそもこれらの無効な価格を追加しないようにするには、次のように、ネストされた属性ハッシュからそれらを削除できます。

class Product < ActiveRecord::Base
  def self.clean_attributes!(product_params)
    product_prices = product_params['prices'] || []
    product_prices.reject!{|price| price['value'].to_f == 0 rescue true }
  end
end

Product.clean_attributes!(params[:product])
Product.new(params[:product])
于 2012-07-09T20:03:54.723 に答える