【问题标题】:Rails has_one: check if new associationRails has_one:检查是否有新关联
【发布时间】:2019-01-21 09:24:58
【问题描述】:

我有一个以下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

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

【问题讨论】:

  • 你试过technician_id_changed吗?
  • @LeninRajRajasekaran 我做到了。它返回一个 NoMethodError (NoMethodError (undefined method 'technician_id_changed?' for #&lt;Project:0x00007f7fef6678f0&gt;))
  • 你可以使用association callbacks
  • project.technician.changed? 不起作用,因为您在技术员实例上调用 .changed? - 而不是 project 的属性。 technician_id_changed 仅在您将 belongs_to 与项目表上的技术员 ID 列关联时才有效。

标签: ruby-on-rails associations


【解决方案1】:

在technical_membership 模型中捕获这个并使用before_save 方法怎么样?

technician_membership.rb

before_save :check_new_assignation

def check_new_assignation
  if project_id.changed?
    send_notification
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多