2013-08-31 1 views
0

Ситуация:accepts_nested_attributes_for с ключом "_destroy"

class Cellar < ActiveRecord::Base 
    belongs_to :house, dependent: :destroy 

    accepts_nested_attributes_for :house, allow_destroy: true 

    attr_accessible :house_id, :house_attributes, [...] 
end 

.

class House < ActiveRecord::Base 
    has_one: cellar 
end 

Проблема:

Когда я посылаю Cellar форму и включают в себя пару ключ-значение "_destroy" => "true" внутри house_attributes, дом разрушается, как должно, но Cellar.house_id не обновляется NULL.

Это нормальное поведение? Как лучше всего исправить это?

+0

У вас есть искажающие объявления в ваших моделях. Ваша модель «Cellar» установлена ​​на 'зависимый:: destroy' на родительском объекте« Дом », но вы хотите, чтобы объект« Cellar »оставался после разрушения дома? Это не имеет смысла ИМО. – zeantsoi

+0

Даже если я прокомментирую '' 'depend:: destroy''', проблема остается прежней. – TomDogg

+0

Ваша ассоциация в корне ошибочна. Родитель должен принимать вложенные атрибуты для ребенка, а не наоборот. – zeantsoi

ответ

0

Для полноты картины, вот что я в конечном итоге делает для того, чтобы исправить проблему:

class Cellar < ActiveRecord::Base 
    belongs_to :house, dependent: :destroy 

    accepts_nested_attributes_for :house, allow_destroy: true 

    attr_accessible :house_id, :house_attributes, [...] 

    # I ADDED THIS: 
    before_save :drop_invalid_id 
    def drop_invalid_id 
    self.house_id = nil if house.marked_for_destruction? 
    end 
end 
0

Это может быть нормально в зависимости от версии Rails ... Я думаю, до Rails 3.2 было нормально, если внешний ключ оставался нетронутым при уничтожении объекта (и наоборот при обновлении внешнего ключа до нуля). Какую версию Rails вы используете?

Но, несмотря на это, если вы хотите, чтобы продолжать идти как есть и просто очистить внешний ключ на @cellar после сохранения, то вы всегда можете просто позвонить @cellar.reload после успешного @cellar.save. Это обновит состояние вашего объекта @cellar из базы данных и удалит атрибут house_id, так как он больше не присутствует.

+0

Я использую Rails 3.2.12. Но, к сожалению, '' '@ cellar.reload''' не удаляет' '' house_id''' (который был отправлен вместе с '' 'house_attributes'' и ключ' '' _destroy'') из дб. Поэтому я полагаю, что у меня остались 3 варианта: a) предложение zeantsoi (переделать модель) или b) удалить «' 'id''' из формы с помощью JS или c) удалить ее из db, после сохранить. – TomDogg

+0

Упс, б), очевидно, не имеет смысла. – TomDogg