Как выполнить расширенную логику, когда конкретное поле обновляется в Rails? - PullRequest
0 голосов
/ 22 ноября 2010

Скажем, у меня есть три модели, которые выглядят (в основном) так:

class User < ActiveRecord::Base
  has_many :projects
  has_many :deliverables
end

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :deliverables
end

class Deliverable < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

Теперь, скажем, я хочу, чтобы произошло следующее: когда project переносится из одной user в другуювсе связанные deliverables будут переданы вместе с ним.Так что-то вроде:

project = Project.find(some_criteria)

deliverables = project.deliverables

project.user_id = new_user_id

deliverables.each do |d|
  d.user_id = new_user_id
end

Есть ли способ автоматизировать то, что я только что описал?Конечно, я всегда мог бы просто поместить это в метод (например, transfer_user), но я бы предпочел, чтобы это происходило автоматически всякий раз, когда user_id устанавливается в новое значение.

1 Ответ

4 голосов
/ 22 ноября 2010

Возможно, вы все еще хотите реализовать метод Transfer_user, но добавьте обратный вызов в модель вашего проекта, выполнив:

class Project < ActiveRecord::Base
  after_save :transfer_user, :if => "user_id_changed?"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...