В чем разница между внешними ключами и accepts_nested_attributes_for

#ruby-on-rails #foreign-keys

#ruby-on-rails #внешние ключи

Вопрос:

Как следует из названия, я не знаю, в чем реальные различия между foreign_key и accepts_nested_attributes_for . Я немного погуглил и прочитал документы API. Но разница неясна.

Комментарии:

1. Я не знал, что между ними есть какое-либо сходство.

2. Не обязательно говорить, что есть сходства.. Кажется, я мог бы использовать foreign_key вместо accepts_nested_attributes_for … но я не знаю, почему я не мог.

3. Оба они совершенно разные. foreign_key используется для реализации relation между двумя или более моделями. И accepts_nested_attributes_for позволяют вам сохранять attributes на associated records через родительский.

Ответ №1:

Тег accepts_nested_attributes описывает модель, которая влияет на внешний вид моделей. Опция: foreign_key влияет на внешний вид таблиц путем создания внешнего ключа СУБД в соответствии с ассоциацией, которая его использует.

Мы говорим, что существует внешний ключ из столбцов таблицы T (c, …), ссылающийся на столбцы таблицы U (d, …), когда значения для (c, …) подстрок в T должны отображаться как значения для (d, …) подстрок U, и каждая такая подстрока U уникальна в U. Это означает, что соответствующие модели будут иметь эти поля, а объект модели T с некоторыми значениями для полей (c, …) будет иметь ровно одно соответствующий объект модели U с этими значениями для полей (d,…). Сообщение СУБД об этом позволяет ей проверять обновления и оптимизировать запросы.

Модели захотят, чтобы в таблицах было такое ограничение, и / или воспользуются таким ограничением. Они будут создавать внешние ключи (например, в belongs_to) или предлагать или не предлагать методы (например, возвращающий одно значение вместо набора значений) в зависимости от обстоятельств.

Наличие внешнего ключа имеет отношение к accepts_nested_attributes, потому что это позволяет вам использовать методы для обновления объекта в другом классе из того, который имеет отношение «многие к одному» к нему. Но внешний ключ может существовать по другим причинам. И у вас могло бы быть отношение «многие к одному» без внешнего ключа, потому что целевой столбец может быть не уникальным в своей таблице.