在我的 Rails 项目中,我有一个通过关系命名空间的 has_many Scheme
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
如果我打开 Rails 控制台
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”
这是 School::Contact::Email 表的迁移
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
我们将不胜感激任何类型的帮助
最佳答案
您非常接近这一点 - Rails 实际上期望外键反射(reflect)关联对象类的名称 + _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
希望对您有所帮助 - 如果您有任何问题,请告诉我您的进展情况并大声疾呼。
关于ruby-on-rails - Rails 通过缺少列命名空间 has_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013291/