如何在某些特殊情况下跳过活动记录验证?

时间:2015-05-27 06:54:31

标签: ruby-on-rails ruby validation activerecord

我正在进行人力资源规划的RoR申请。 Normaly不允许删除过去的条目。我不时要删除用户,当然我想删除所有条目。

我的用户模型:

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

TeamMembership模型:

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验证?

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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,您只能跳过此特定回调,而不是所有回调和相关的销毁操作。

答案 1 :(得分:0)

您可以拨打Enumerable<int>来跳过回调。