Нужно ли указывать параметр foreign_key одновременно как принадлежащий для own_to и has_many? - PullRequest
0 голосов
/ 12 января 2019

Я пишу некоторый код Ruby-on-Rails, и у меня возник вопрос о том, как использовать foreign_key в отношении own_to / has_many. У меня есть две модели, одна Slogan, а другая User. Отношение между ними - один слоган, соответствует только одному пользователю (own_to), и у пользователя может быть много записей слогана (has_many). Код двух моделей указан ниже

# slogan.rb
class Slogan < ApplicationRecord
  belongs_to :author, class_name: :User, foreign_key: :author_id
end
# user.rb
class User < ApplicationRecord
  has_many :slogans
end

Для удобства обслуживания и семантики я изменяю имя ассоциации на слогане на автора (оно должно быть изначально пользователем) и заменяю ключ_приятия на author_id.

И мой вопрос заключается в том, должен ли я также добавить опцию foreign_key в модель пользователя, если я также хочу ко всем слоганам, которые он / она имеет из записи пользователя?

Спасибо !!

Ответы [ 3 ]

0 голосов
/ 13 января 2019

В вашем сообщении об ошибке я вижу идентификатор user_id, а не author_id. Вы можете изменить идентификатор в таблице на author_id или удалить foreign_key из модели слогана. Ограничение foreign_key сообщает вашей Slogan модели, которая должна искать столбец author_id в БД. Он не может найти этот столбец, потому что он называется user_id.

0 голосов
/ 14 января 2019

Вы должны добавить опцию foreign_key в вашу модель User.

Из документа https://guides.rubyonrails.org/association_basics.html#has-many-association-reference:

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

Так что, если вы не добавите опцию foreign_key, Rails предполагает, что у вас есть столбец user_id в таблице slogans, это причина, по которой у вас есть эта ошибка .

0 голосов
/ 12 января 2019

Не думаю, что вам нужно что-то добавлять. Но вы можете использовать двунаправленную ассоциацию в Rails. Active Record предоставляет опцию :inverse_of, поэтому вы можете явно объявить двунаправленные ассоциации:

class Author < ApplicationRecord
  has_many :books, inverse_of: 'writer'
end

class Book < ApplicationRecord
  belongs_to :writer, class_name: 'Author', foreign_key: 'author_id'
end

Используя это, вы можете использовать следующим образом:

a = Author.first
b = a.books.first
a.first_name == b.writer.first_name # => true
a.first_name = 'David'
a.first_name == b.writer.first_name # => true

Для получения дополнительной информации см .: https://guides.rubyonrails.org/association_basics.html

...