#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, потому что это позволяет вам использовать методы для обновления объекта в другом классе из того, который имеет отношение «многие к одному» к нему. Но внешний ключ может существовать по другим причинам. И у вас могло бы быть отношение «многие к одному» без внешнего ключа, потому что целевой столбец может быть не уникальным в своей таблице.