ActiveRecord生成错误的关系HABTM名称

时间:2015-07-15 04:43:11

标签: ruby-on-rails ruby activerecord

我正在使用Rails在我的表之间生成HABTM关系。我的表格名称为canvas,但canvas.singularize会生成canva,这不是正确的字词。所以我在config/initializers/inflections.rb中做了一些更改:

inflect.irregular 'canvas', 'canvases'

这是我的迁移:

create_table :canvases do |t|
end

create_table :questions do |t|
end

create_join_table :canvases, :questions do |t|
  t.index  :question_id
  t.index  :canvas_id
end

但是,在控制台中运行CanvasQuestion.find_by_canvas_id_and_question_id(1,1)会产生此错误:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "canvas_questions" 
does not exist LINE 5:                WHERE a.attrelid = '"canvas_questions"'::regc...

在我看来,ActiveRecord正试图找到表canvas_questions而不是canvases_questions。现在,我要使用Gem composite_primary_keys并更改我的模型以使其正常工作:

class CanvasQuestion < ActiveRecord::Base
  self.table_name = 'canvases_questions'
  self.primary_keys = :canvas_id, :question_id 
end

有没有正确的方法来解决这个问题?因为我现在正在考虑这个错误,因为ActiveRecord将CanvasQuestion翻译为canvas_questions而不是canvases_questions,即使我已将canvas字变换改为{ {1}}

1 个答案:

答案 0 :(得分:1)

问题在于CanvasQuestion.find_by_canvas_id_and_question_id(1,1),您无法使用 HABTM join-table 进行查询,因为 模型 join-table 不应该存在。

来自API doc

  

联接表不应包含主键或模型   用它。

我在我的项目中测试了你的代码,当我运行CanvasQuestion.find_by_canvas_id_and_question_id(1,1)NameError: uninitialized constant CanvasQuestion所以 Rails 正在寻找 CanvasQuestion 哪个不存在。

我的建议是使用 has_many :through 。从指南中查看此Choosing between Habtm and has_many :through。它会对你有所帮助。