Предотвратить повторяющиеся полиморфные записи - PullRequest
0 голосов
/ 27 июня 2018

У меня есть приложение Rails 5 с таблицей отношений. Столбцы таблицы выглядят так:

вспениваемый (полиморфный) toable (полиморфный)

Я хочу, чтобы пользователи не могли сохранять отношения, которые являются дубликатами (то есть имеют одинаковую возможность преобразования и переноса). Я пытался сделать следующее:

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 голосов
/ 27 июня 2018

Вы можете использовать проверку уникальности вместо написания своего собственного для обработки этого: *

validates_uniqueness_of :fromable_id, scope: [:toable_id, :toable_type, :fromable_type], allow_nil: true

Он автоматически проверит комбинацию из вспениваемых и выпираемых предметов на уникальность.

0 голосов
/ 27 июня 2018

Вы также можете использовать .exists?, если вы проверяете только правдивость или ложь. например:

if Relation.exists?(toable: self.toable, fromable: self.fromable) errors.add(:base, "DUPLICATE") end

0 голосов
/ 27 июня 2018

Relation.where(toable: self.toable).where(fromable: self.fromable) возвращает объект отношения , который всегда равен truthy.

Вы должны явно проверить его на пустоту:

unless Relation.where(toable: self.toable).where(fromable: self.fromable).empty?
...