Использование другого внешнего ключа с вложенными ресурсами в Rails

StackOverflow https://stackoverflow.com//questions/25087134

Вопрос

При работе с вложенными ресурсами в 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'.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top