У нас есть три класса
class a
has_many :b
has_many :c, through: b
end
class b
belongs_to :a
belongs_to :c
end
class c
has_many :b
has_many :a, through: :b
validates_uniqueness_of :name
end
Если каким-то образом 2 объекта класса c
находятся в базе данных с одинаковым значением name
, когда я пытаюсь создать экземпляр класса a
, я был удивился, увидев, что проверки класса c
запущены! Почему проверки выполняются, когда я вообще не должен касаться строки класса c
?
@ max попросил привести пример.
После создания нового проекта Rails 5 выполните:
rails g model a
rails g model c name:string
rails g model b a:references c:references
Отредактируйте a.rb, чтобы он выглядел так:
class A < ApplicationRecord
has_many :b
has_many :c, through: :b
end
Отредактируйте c .rb, чтобы он выглядел так:
class C < ApplicationRecord
has_many :b
has_many :a, through: :b
end
В консоли рельсов сделайте:
C.create(name: 'first')
C.create(name: 'first')
Изменить класс C, добавив:
validates_uniqueness_of :name
В консоли рельсов:
A.create!(c_ids: [1])
И вы получите исключение:
ActiveRecord::RecordInvalid (Validation failed: C is invalid)
Как я уже сказал, я знаю, что данные неверны, но я просто удивлен, что проверка выполняется. Я не думаю, что это происходило в Rails 4.