Как настроить ассоциацию has_one для редактирования модели?

Есть модель model1, она has_one: model2
Есть роут для внесения изменений в model1:
class Model1Controller
	def update
		@model1 = Model1.where(params[:id]).first
		@model1.with_lock do
			@model1.update_attributes({:model1attr, :model2_attributes=>{:model2attr}})
			if @model1.errors.empty?
				flash[:success] = "все хорошо"
			else
				flash[:error] = "все плохо"
			end
			redirect_to кудабытонибыло
		end
	end
end

Проблема заключается в том, что при редактировании записи в связанной таблице model2 запрос строится таким образом, что связанная запись удаляется, а затем вставляется новая (в логах 2 запроса delete model2, insert model2), Если при вставке новой записи не проходит валидация полей model2, то insert не случается и запись утеривается.
Вопрос 1. Можно ли настроить поведение рельс таким образом, чтобы она вызывала update запрос на связанной модели
Вопрос 2. Если нельзя так сделать, то как отменить удаление связанной записи, транзакция в том виде, которая представлена не спасает
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 2
@jarosluv
Обновление связной модели - это стандартное поведение Rails. Если у вас приложение ведёт себя иначе - нужно разбираться, смотреть сопутствующий код (модели, вьюхи, как минимум).

Также предлагаю вам попробовать воспроизвести свою ошибку на минимально рабочем приложении (2 модели и контроллер), а код выложить на Github.

Ещё обращу внимание, что связные модели и так обновляются через транзакции, поэтому метод with_lock - лишний.
Ответ написан
Комментировать
@modernstyle
Code GOD
Слишком сложно сформулировали вопрос. Вас интересует можно ли обновить updated_at на связанных моделях при редактировании родителя? Можно, через хук в модели например так:

after_save do
  model.update_attribute(:updated_at, Time.now)
end


Либо еще лучше использовать model.touch
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы