我是一名从事Rails API的新手Ruby程序员。我有一个位置模型和一个用户模型,一个位置有很多用户。他们是这样的:
class Location << ActiveRecord::Base
has_many: :users
end
class User << ActiveRecord::Base
belongs_to :location
end
我想在Location模型上设置一个约束,以便如果Location模型对象有一个或多个关联的Users,则不会销毁它。
考虑孟买的情况,这是一个位置,它有一个或多个用户。因此,我无法破坏该位置;只有在没有特定位置的用户时才能销毁。
如何以受保护的方式处理销毁记录,例如?
答案 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