我有以下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
检查关联是否已创建/更新的最佳方法是什么?
答案 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