在摧毁之前回电话

时间:2016-05-16 13:21:38

标签: ruby-on-rails ruby destroy

我是一名从事Rails API的新手Ruby程序员。我有一个位置模型和一个用户模型,一个位置有很多用户。他们是这样的:

class Location << ActiveRecord::Base
  has_many: :users
end

class User << ActiveRecord::Base
  belongs_to :location
end

我想在Location模型上设置一个约束,以便如果Location模型对象有一个或多个关联的Users,则不会销毁它。

考虑孟买的情况,这是一个位置,它有一个或多个用户。因此,我无法破坏该位置;只有在没有特定位置的用户时才能销毁。

如何以受保护的方式处理销毁记录,例如?

4 个答案:

答案 0 :(得分:1)

只需在模型中添加以下内容:

# in app/models/location.rb
before_destroy :ensure_no_users

private
def ensure_no_users
  return false if users.any?
end

答案 1 :(得分:1)

在您的位置模型中添加以下内容:

 before_destroy :check_for_users #This will be run before destroy is called.



def check_for_users
  return false if self.users.present?
end

答案 2 :(得分:1)

您可以将位置模型更新为:

class Location << ActiveRecord::Base
  before_destroy :confirm_safe_to_destroy

  has_many: :users

private

  def confirm_safe_to_destroy
    return false if users.any?
  end
end

这将使用before_destroy处理程序来检查是否可以安全地销毁Location模型对象。如果有任何与该位置关联的用户,则confirm_safe_to_destroy方法返回false以停止销毁过程。

答案 3 :(得分:1)

您还可以向实例添加错误消息:

class Location << ActiveRecord::Base
  has_many: :users
  before_destroy :check_for_users

  def check_for_users
    return if users.any?
    errors[:base] << "some error message"
    false
  end
end

然后您甚至可以访问控制器中的错误消息:

if @location.destroy?
  # success flow - location was deleted
else
  @location.errors.full_messages #=> "some error message"
end