防止重复的多态记录

时间:2018-06-27 06:47:54

标签: ruby-on-rails ruby postgresql polymorphism ruby-on-rails-5

我有一个带有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

但这似乎会触发所有内容无效吗?

3 个答案:

答案 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