Rails has_one:检查是否有新的关联

时间:2019-01-21 09:24:58

标签: ruby-on-rails associations

我有以下Project模型:

class Project < ApplicationRecord
  belongs_to :manager,
             class_name: 'User'

  has_many :memberships,
           dependent: :destroy

  has_one :technician_membership, -> { technicians }, class_name: 'Membership'
  has_one :technician, through: :technician_membership, class_name: 'User', source: :user

  (...)
end

如果要向项目分配新技术人员,我想创建一个通知。我正在努力的是知道技术人员是否在保存时进行了更改。

我希望this SO thread能解决我的问题,但不幸的是,它不能解决问题。

project.technician
=> nil
project.technician = User.find 4
=> #<User id: 4, ...>
project.technician.changed?
=> false
project.technician_changed?
=> false

检查关联是否已创建/更新的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

但是您可以按照以下方式获得project.technician_changed?

class Project < ApplicationRecord

  def technician_changed?
    changed_attributes.has_key?('technician_id')
  end

end

以上,如果您为ID为232的项目分配新技术人员,changed_attributes将提供{'technician_id'=>232}

注意:如有需要,请进行更正,

如果您的项目中有manager_id,就可以了,但是如果表user_id中有projects

  belongs_to :manager, class_name: 'User', foreign_key: 'user_id'

更新

根据您的关联,您需要应用以下逻辑,

project.technician = @user # @user = User.find(4)
=> #<User id: 4, ...>

@user.changed_attributes
=> {project_id=>21}

检查您分配的用户,而不是项目。

答案 1 :(得分:0)

在技术员成员资格模型中捕获并使用before_save方法怎么样?

technician_membership.rb

before_save :check_new_assignation

def check_new_assignation
  if project_id.changed?
    send_notification
  end
end