Rails запускает проверки ассоциаций при создании? - PullRequest
0 голосов
/ 10 марта 2020

У нас есть три класса

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.

1 Ответ

1 голос
/ 11 марта 2020

has_many ассоциации подтверждают ассоциации по умолчанию. Если вы хотите обойти это, вы можете установить ключ validate для ассоциаций has_many равным false (по умолчанию это правда). Вы можете увидеть больше опций для has_many здесь: https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method -i-has_many

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...