Уничтожить после сохранения, если связь пуста? - PullRequest
0 голосов
/ 13 декабря 2011

Как бы я уничтожил 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 ]

2 голосов
/ 13 декабря 2011

как насчет использования ActiveModel :: Validations? Вы не хотите сохранять запись, если какой-либо атрибут не заполнен. Поэтому вам нужна проверка.

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

Edit:

ваш код выглядит так, что вы хотите создавать продукты muti, использующие общие атрибуты. это могут быть такие параметры:

{"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 (&: сохранить) redirect_to: back,: note => "Успех!" еще визуализация: новый конец конец

Валидация не требует изменений. но форма немного усложнит.

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

код прост, вы можете улучшить вид самостоятельно.

2 голосов
/ 13 декабря 2011

Это больше похоже на проблему проверки. Если он недействителен без Store, вам не следует сохранять его в БД без ссылки Store.

Если вы хотите уничтожить Product, вы должны сделать это напрямую, вместо того, чтобы сохранять нулевую ссылку в магазине, пытаться ее перехватить, а затем уничтожить в результате.

Пытаясь уничтожить запись, когда ее связь неверна, вы, по сути, говорите: «Это недопустимое состояние, и его не должно быть в базе данных».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...