Ruby Ограничения внешнего ключа в базе данных против модели - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующие модели в приложении Rails. Эта установка работала нормально, так как обычно, когда я хотел бы добавить нового VendorPromo к поставщику, в раскрывающемся списке доступных промо на выбор. Теперь я разрешаю создание нового VendorPromos через API. Однако эта текущая настройка позволит создать VendorPromo с любым promo_id, даже если он не существует в Promo. Я видел belongs_to :promo, foreign_key: :promo и знаю, что вы можете добавить ограничение внешнего ключа через БД. Что я хотел бы знать, так это разницу между этими двумя подходами, и если один из них лучше?

Редактировать: я признаю, что ограничения приложения отличаются от ограничений БД, но когда я применяю ограничение в приложении, т.е. belongs_to :promo, foreign_key: :promo похоже, что на самом деле это ограничение вообще не применяется. В частности, я могу создать новый VendorPromo с promo_id, скажем, 13, хотя Promo имеет только идентификаторы от 1 до 8.

class Vendor
  has_many :vendor_promos
end

class VendorPromo
  belongs_to :vendor
  belongs_to :promo
end

class Promo
end

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Ответ Хуана Карлоса был частью пути туда. Это правда, что атрибут foreign_key в belongs_to не применяет внешний ключ уровня базы данных или приложения. Что я искал, так это то, что флаг belongs_to :promo, optional: false фактически обеспечивает внешний ключ уровня приложения. Этот флаг, в дополнение к ограничению внешнего ключа на уровне БД, решил мою проблему.

0 голосов
/ 06 февраля 2020

Атрибут foreign_key в методе belongs_to фактически не определяет внешний ключ, он указывает внутренним компонентам rails, какое поле содержит внешний ключ.

Ruby в Rails Guide предупреждает вас о это здесь: https://guides.rubyonrails.org/association_basics.html#options -for-has-many-foreign-key

В любом случае Rails не будет создавать столбцы внешнего ключа для вас. Вам необходимо явно определить их как часть ваших миграций.

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