如果关联为空,则在保存后销毁?

时间:2011-12-13 02:10:38

标签: ruby-on-rails ruby ruby-on-rails-3

如果Product不属于Store after_save,我将如何销毁它?

class Product < ActiveRecord::Base
  attr_accessible :price, :name, :product_store
  belongs_to :store
  attr_reader :product_store

  # I need this to do also "p.product_store.blank?"
  after_save { |p| p.destroy if p.name.blank? && p.price.blank? }

  def product_store=(id) # using Jquery TokenInput so only needed this.
    self.store_id = id
  end
end

我尝试了几种不同的方法,如:

after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.product_store.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store.id.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store_id.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store.blank? }

但是这些没有用,所以我请求你帮忙解决它的问题?


这是我的表单和控制器:https://gist.github.com/1472629

2 个答案:

答案 0 :(得分:2)

这似乎更像是验证问题。如果没有Store它无效,那么您根本不应该在没有Store引用的情况下将其保存到数据库中。

如果你想销毁Product,你应该直接这样做,而不是保存对商店的零引用,试图抓住它,然后将其销毁。

通过尝试在其关联不正确时销毁记录,您实际上是在说“这处于无效状态,并且不应该首先在数据库中。”

答案 1 :(得分:2)

如何使用ActiveModel :: Validations? 如果某些属性没有填写,你不想保存记录。所以你需要验证。

class Product < ActiveRecord::Base
  validates_presence_of :name, :price, :store_id
end

编辑:

您的代码看起来想要使用常用属性创建多个产品。 可能是这样的参数:

{"products" => {:1 => {:name => "good", :desc => "sss"}}, {:2 => {:name => "good", :desc => "tt"}}, "product" => {:price => "10"} }

控制器     def create_multiple       @products = params [:products] .values.collect do | up |         Product.new(up.merge(PARAMS [:产品]))       结束       if @ products.each(&amp;:save)         redirect_to:back,:notice =&gt; “成功!”       其他         渲染:新的       结束     端

验证不需要更改。但形式会有点复杂。

form_tag "/products" do
  %p
   = text_field_tag "product[price]", @products.first.price
   = @products.first.errors[:price]

  - @products.each_with_index do |product, idx|
     = text_field_tag "products[#{idx}][name]", product.name
     = product.errors[:name]

  = submit_tag :submit

代码很简单,你可以自己增强视图。