Как предотвратить проверку, если родитель для - PullRequest
0 голосов
/ 24 сентября 2018

ActiveRecord автоматически проверяет, существует ли родительский элемент при сохранении или создании дочерней записи.Есть ли способ предотвратить эту проверку?

Например

class Project
  has_many :projectitems
end

class Projectitem
  belongs_to :project
end

Если я сейчас выполню обновление, я вижу в файле журнала:

Project Load (0.1ms)  SELECT  `projects`.* FROM `projects` WHERE `projects`.`id` = 49 LIMIT 1
Projectitems Update (0.2ms)  UPDATE `projectitems` SET .....

Я делаюне нужно проверять родительскую запись.Я знаю, что это там, и этот дополнительный запрос только вызывает ненужную загрузку БД.

1 Ответ

0 голосов
/ 24 сентября 2018

Rails 5 требует :belongs_to ассоциаций для существования по умолчанию.Дополнительной проверкой, которую вы видите, является проверка того, что ваш проект все еще существует.

Если вы хотите отключить это поведение, вы можете указать, что связь необязательна:

class Projectitem
  belongs_to :project, optional: true
end

Если вы собираетесь это сделать, вам, вероятно, понадобятся дополнительные средства защиты, чтобы гарантировать, что Projectitems не может стать «осиротевшим».Например, если вы удалите Project, вы можете также удалить все связанные элементы проекта:

class Project
  has_many :projectitems, dependent: :destroy
end

В качестве альтернативы, вы можете отметить projectitems.project_id как внешний ключ на уровне базы данных,который может обеспечить тот же уровень защиты, что и стандартная проверка Rails, но для всех клиентов (это особенно полезно, если ваше приложение Rails не единственное приложение для подключения к базе данных).

Другая альтернатива (иодин, который я лично рекомендовал бы) - оставить дефолт Rails в покое.Это может показаться непропорциональной нагрузкой на ваш сервер, когда ваши другие транзакции с базой данных очень просты, но на самом деле они очень быстрые и не слишком медленные;однако ваши обновления могут со временем расти, если вы добавите больше полей и индексов.

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