table_name_prefix的has_and_belongs_to_many问题

时间:2018-03-07 14:18:13

标签: ruby-on-rails activerecord has-and-belongs-to-many jointable

ich想请求has_and_belongs_to_many协会的一些帮助。

我有以下表格和模型:

candidate_job_title_translations - > Candidate :: JobTitleTranslation(在table_name_prefix的子文件夹中)

create_table "candidate_job_title_translations", force: :cascade do |t|
end

profile_experiences,ProfileExperience

create_table "profile_experiences", id: :serial, force: :cascade do |t|
end

candidate_job_title_translations_profile_experiences,没有型号

create_table "candidate_job_title_translations_profile_experiences", id: false, force: :cascade do |t|
    t.bigint "candidate_job_title_translation_id", null: false
    t.bigint "profile_experience_id", null: false
end

为关联设置了两个模型:

class ProfileExperience < ApplicationRecord
   has_and_belongs_to_many :candidate_job_title_translations, class_name: 'Candidate::JobTitleTranslation'
end

class Candidate::JobTitleTranslation < ApplicationRecord
   has_and_belongs_to_many :profile_experiences, class_name: 'ProfileExperience'
end

我现在的问题是,我收到一个ActiveRecord错误,说job_title_translation_id不存在,这是正确的。它应该寻找candidate_job_title_translation_id

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column candidate_job_title_translations_profile_experiences.job_title_translati
on_id does not exist
LINE 1: ...ces" ON "candidate_job_title_translations"."id" = "candidate...

我觉得我可以通过不使用table_name_prefix和模型结构来解决它,但这在我的结构方面并不好。 也许你有个主意。

谢谢

1 个答案:

答案 0 :(得分:1)

这不是一个好的领域模型。

如果您想要翻译表,您可以这样做:

class Position
  belongs_to :title
  has_many :translated_titles, 
    through: :title,
    source: :translations
end

class Title
  has_many :positions
  has_many :translations, 
    class_name: 'Titles::Translation'
end

class Titles::Translation
  belongs_to :title
end

你应该更关心创造有意义的关系和重复而不是“我不想要另一个班级,等等”,这是选择HABTM的最常见原因。

当Rails中的“命名空间”模型时,模块应该是复数:

好:Titles::Translation
不好:Title::Translation

这个约定是由于ActiveRecord将表映射到表到类的方式,以及将模型嵌套到另一个模型类中的事实并不是一个好主意。