Использование другого внешнего ключа с вложенными ресурсами в Rails
-
02-01-2020 - |
Вопрос
При работе с вложенными ресурсами в Rails возможно ли использовать значение / поле, отличное от первичного ключа родительского ресурса, в качестве внешнего ключа для объектов дочернего ресурса?
например ,если у меня есть "книги", принадлежащие "авторам", я передаю первичный ключ "автора" книге при ее создании с помощью t.references :author, index: true
в app/db/migrate/[timestamp]_create_books.rb (верно?).
Можно ли вместо этого передать имя автора?(Предполагая, что в таблице "авторы" есть поле "имя" ...)
Я спрашиваю, потому что у меня есть уже существующая таблица книг с различными полями (автор, название, тема, год и т.д.), И кажется проще создать авторы таблица с уникальными авторами из Книги стол, а затем присоединяйтесь к ним, где authors.name=books.author
вместо того, чтобы придумывать способ получения уникальных первичных ключей от авторы чтобы связаться с правильным автором в Книги.(Но я, вероятно, совершенно не прав на этот счет.) (В любом случае, мне любопытно, если это может будет сделано и / или каким был бы надлежащий способ ввода ранее существовавшей базы данных, в которой отсутствуют ассоциации автор-книга.)
(Прошу прощения, если моя терминология не соответствует действительности.)
Решение
Итак, ваши модели:
class Author < ActiveRecord::Base
has_many :books
end
class Book < ActiveRecord::Base
belongs_to :author, primary_key: "name", foreign_key: "author_name"
end
Это должно сработать.Но этот способ ломает один из краеугольных камней Рельсов:"Соглашение важнее конфигурации", и именно поэтому у вас есть шансы когда-нибудь столкнуться с полным беспорядком в вашей базе данных.
А какие еще атрибуты, кроме "имени" Author
модель имеет?Если их немного (или даже только одна - "name"), будет лучше и проще иметь только одну модель 'Book
' с атрибутом 'author'.