Rails автоматически сохраняет не сохраняя изменения в ассоциациях - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь сделать следующее, чтобы внести изменения как в родительскую, так и в дочернюю ассоциацию, используя автосохранение, но безуспешно.

@child = @parent.childs.last
if child's attribute satisfies some condition
  @parent.something = "asd"
  @child.something = params[:something]
end

@parent.save

Это только сохраняет изменения, внесенные в родительский объект. Есть ли способ сохранить оба изменения только одним вызовом "save"?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

По умолчанию автоматически сохраняются только новые записи ассоциации. Вам нужно включить механизм автосохранения, передав опцию в ассоциацию, см. https://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html.

class Parent
  has_many :children, autosave: true
end

Обратите внимание, что это работает только в одну сторону, если вы хотите, чтобы родитель был сохранено, когда вы сохраняете ребенка, вам нужно обратное

class Child
  belongs_to: parent, autosave: true
end

Это работает только до тех пор, пока Rails знает, что вы работаете с ассоциацией. Вызов @parent.childs.last возвращает вам простой экземпляр класса Child. Так что вам нужно явно сохранить его.

0 голосов
/ 21 января 2020

Как насчет сохранения родительского объекта и создания обратного вызова after_save, где записывается лог c обновления его потомков?

что-то вроде:

after_save :update_children

  def update_children
    children.update_all(something: something else)
  end

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