Rails пространство имен has_many через отсутствующий столбец - PullRequest
0 голосов
/ 24 июня 2018

В моем проекте rails у меня есть пространство имен has_many через отношение Схема

models / school / contact.rb

class School::Contact < ApplicationRecord

  belongs_to :school, class_name: '::School'

  has_many :school_contact_emails, class_name: 'School::Contact::Email'
  has_many :emails, through: :school_contact_emails, class_name: '::Email'

end

models / school / contact / email.rb

class School::Contact::Email < ApplicationRecord
  belongs_to :school_contact, class_name: 'School::Contact'
  belongs_to :email, class_name: '::Email'
end

models / email.rb

class Email < ApplicationRecord
  has_many :school_contact_emails, class_name: 'School::Contact::Email'
  has_many :school_contacts, through: :school_contact_emails, class_name: 'School::Contact'
end

Если я открою консоль рельсов

s = School::Contact.first
=> #<School::Contact id: 1, name: "Headmaster Name", surname: "Headmaster Surname", school_contact_role_id: 1, school_id: 2285, created_at: "2018-06-24 17:47:21", updated_at: "2018-06-24 17:47:21", creator_id: 1, updater_id: 1>

Если я поищу электронные письма

s.emails
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column school_contact_emails.contact_id does not exist)

Он говорит, что school_contact_emails.contact_id не существует, но столбец таблицы должен быть "school_contact_id"

ВотМиграция для школы :: Контактная информация :: Таблица электронной почты

class CreateSchoolContactEmails < ActiveRecord::Migration[5.1]
  def change
    create_table :school_contact_emails do |t|
      t.references :school_contact, foreign_key: true
      t.references :email, foreign_key: true

      t.timestamps
      t.userstamps
    end
  end
end

Любая помощь будет очень признательна

1 Ответ

0 голосов
/ 25 июня 2018

Вы очень близки с этим - Rails фактически ожидает, что внешний ключ будет отражать имя класса ассоциированного объекта + _id, в данном случае contact_id, вместо использования имени самой ассоциации (в этом кейс school_contact).

Это дает вам две возможности: вы можете переименовать столбец в вашей базе данных или добавить опцию foreign_key к вашей ассоциации.

Например:

class School::Contact::Email < ApplicationRecord
  belongs_to :school_contact, class_name: 'School::Contact', foreign_key: 'school_contact_id'
  belongs_to :email, class_name: '::Email'
end

Надеюсь, это поможет - дайте мне знать, как вы ладите и кричите, если у вас есть какие-либо вопросы.

...