我有一个带有Relations表的Rails 5应用程序。表格列如下所示:
fromable(多态) 可以(多态的)
我想防止用户保存重复的关系(即,具有相同的可追溯和可追溯的关系)。我尝试执行以下操作:
class Relation < ApplicationRecord
...
belongs_to :fromable, polymorphic: true
belongs_to :toable, polymorphic: true
validate :is_not_duplicate_relation
private
def is_not_duplicate_relation
errors.add(:base, "DUPLICATE") if Relation.where(toable: self.toable).where(fromable: self.fromable)
end
end
但这似乎会触发所有内容无效吗?
答案 0 :(得分:1)
您可以使用uniqueness validation来代替自己编写代码来处理此问题::
validates_uniqueness_of :fromable_id, scope: [:toable_id, :toable_type, :fromable_type], allow_nil: true
它将自动检查源对象与对象对象的组合是否唯一。
答案 1 :(得分:0)
Relation.where(toable: self.toable).where(fromable: self.fromable)
返回关系对象,该对象始终为truthy
。
您应明确检查其是否为空:
unless Relation.where(toable: self.toable).where(fromable: self.fromable).empty?
答案 2 :(得分:0)
如果您仅检查真假,也可以使用.exists?
。
例如:
if Relation.exists?(toable: self.toable, fromable: self.fromable)
errors.add(:base, "DUPLICATE")
end