代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

在Rails中更新特定字段时,如何执行高级逻辑?

  •  0
  • Dan Tao  · 技术社区  · 15 年前

    假设我有三个模型(基本上)是这样的:

    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 回复  |  直到 15 年前
        1
  •  4
  •   Kang Chen    15 年前

    您可能仍然希望实现transfer_user方法,但可以通过执行以下操作在项目模型中添加回调:

    class Project < ActiveRecord::Base
      after_save :transfer_user, :if => "user_id_changed?"
    end