#ruby-on-rails #ruby #before-save
#ruby-on-rails #ruby #перед сохранением
Вопрос:
Что с этим не так before_save-callback
?
class Order < ActiveRecord::Base
has_many :line_items, :dependent => :destroy, :inverse_of => :order
accepts_nested_attributes_for :line_items
attr_accessible :line_items_attributes
before_save :mark_line_items_for_removal
def mark_line_items_for_removal
line_items.each do |line_item|
line_item.mark_for_destruction if line_item.quantity.to_f <= 0
end
end
end
Когда один из line_items
помечен для уничтожения, ни один line_item
не будет сохранен.
Однако родительский объект Order действительно сохраняется.
Возврат true не имеет значения…
о mark_for_destruction: http://apidock.com/rails/v3.1.0/ActiveRecord/AutosaveAssociation/mark_for_destruction и почему это вместо «:allow_destroy => true»? смотрите здесь: http://weblogs.manas.com.ar/spalladino/2010/03/15/deleting-children-with-accepts_nested_attributes_for-in-rails/
Комментарии:
1. Может быть, есть какие-то проблемы с
if line_item.quantity.to_f <= 0
? Вы уверены, что это не всегда false, например?2. Нет, я проверил с помощью ‘помещает line_item.marked_for_destruction?’ после этой строки. Это дало ожидаемый результат. Но когда один из них был отмечен, ни один из них не был сохранен…
3. Вы когда-нибудь находили ответ на этот вопрос? Я заметил, что пометка дочернего элемента для уничтожения приведет к тому, что отмеченный бот не сохранится, а следующий элемент (т.е.: -1,1,2 — сохранит только 2)
Ответ №1:
Я полагаю, вам нужно установить параметр:автосохранение => true для вашего определения has_many.
Как указано, здесь:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
«Если true, всегда сохраняйте связанные объекты или уничтожайте их, если они помечены для уничтожения, при сохранении родительского объекта. Если false, никогда не сохраняйте и не уничтожайте связанные объекты. По умолчанию сохраняются только связанные объекты, которые являются новыми записями.»