【问题标题】:How can I skip active record validations in some special cases?在某些特殊情况下,如何跳过活动记录验证?
【发布时间】:2015-05-27 06:54:30
【问题描述】:

我正在为人力资源规划申请 RoR。通常不允许删除过去的条目。有时我必须删除用户,当然我想删除所有条目。

我的用户模型:

has_many :team_memberships, dependent: :destroy
has_many :slots, through: :team_memberships, source: :slot

团队成员模式:

before_destroy :check_permission
def check_permission
  if self.slot.start_time < Time.now.beginning_of_day
    errors.add(:base, "Historische Einträge können nicht gelöscht werden")
    return false
   end
end

rake 任务只会销毁旧用户,但当他们有历史条目时,这不起作用。

如何在 rake 任务调用 User.destroy 时跳过 before_destroy 验证?

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby validation activerecord


    【解决方案1】:

    您可以在模型中添加一个新方法来设置变量并将其用作回调的返回值:

    before_destroy :check_permission
    
    def allow_deletion!
      @allow_deletion = true
    end
    
    def check_permission
      if !@allow_deletion && self.slot.start_time < Time.now.beginning_of_day
        errors.add(:base, "Historische Einträge können nicht gelöscht werden")
        return false
      end
    end
    

    这允许你写这样的东西:

    user.allow_deletion!
    user.destroy
    

    delete 相比,此方法的优势在于您仅跳过此特定回调,而不是所有回调和相关的销毁操作。

    【讨论】:

    • 这就是我正在寻找的想法! THX
    【解决方案2】:

    您可以拨打user.delete,这将跳过回调。

    【讨论】:

    • 在这种情况下虽然会注意销毁关联的team_memberships关联
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多