2012-07-09 71 views
0

iam只是問自己,最好的解決方案是什麼問題。Rails 3.決定保存對象是否應該保存

這裏是我的模型:

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 == nilproduct_price.value == 0.0

  1. before_save鉤在ProductPrice中。 return false將回滾整個交易,那不是我想要做的。我只是想「踢」與value == 0 or value == nil
  2. 第一次射門都價格從params[...],比電話Product.new(params[:product])所有price_params似乎並沒有被導軌方式eighter ...
  3. Product.new(params[:product])迭代所有的價格和從數組刪除。但邏輯應該在我的模型中是正確的?我只是不想重複自己創造新價格的每一個控制器...

有人可以告訴我最好的解決方案嗎?什麼是鐵軌方式?

謝謝!

回答

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]) 
+0

但這將回滾事務,並在意見提出了一些錯誤。那不是我想要的。如果我執行product.save,那麼我希望該產品被保存,所有價格> 0!沒有錯誤和回滾。 – ali 2012-07-09 20:13:28

+0

如果是這樣,您可以在傳遞到保存之前從嵌套屬性哈希中刪除這些product_prices - 請參閱更新。 – PinnyM 2012-07-09 20:39:41

+0

哦,這是一個不錯的主意。這個解決方案的問題是,它不會涵蓋其他控制器中的一些情況:'price.value = 0; price.save'。這應該破壞對象。有可能嗎? – ali 2012-07-09 21:17:28