Activerecord HABTM主键问题

时间:2008-11-03 08:28:09

标签: ruby-on-rails activerecord associations

我必须拥有多对多关系的表格。我已经创建了正确的表codesecure_project_tst_definition,它可以工作。我可以通过调用codesecure_projects<<来将行连接在一起TstDefinition对象上的方法。问题是由于某种原因,活动记录想要使用Codesecure_project_id作为codesecure_project_tst_definition表的id值。我究竟做错了什么?我如何修复它,以便在我调用codesecure_projects<<方法它不会尝试设置codesecure_project_tst_definition表的id?

我已在下面发布了迁移

class CreateCodesecureProjects < ActiveRecord::Migration
  def self.up
    create_table :codesecure_projects do |t|
      t.string :name
      t.string :lang

      t.timestamps
    end
  end

  def self.down
    drop_table :codesecure_projects
  end
end


class CreateTstDefinitions < ActiveRecord::Migration
  def self.up
    create_table :tst_definitions do |t|
      t.string :test_name

      t.timestamps
    end
  end

  def self.down
    drop_table :tst_definitions
  end
end


class CreateCodesecureProjectsTstDefinitions < ActiveRecord::Migration
  def self.up
    create_table :codesecure_projects_tst_definitions do |t|
      t.references :codesecure_project
      t.references :tst_definition

      t.timestamps
    end
  end

  def self.down
    drop_table :codesecure_projects_tst_definitions
  end
end

模型的相关部分:

class TstDefinition < ActiveRecord::Base
  has_and_belongs_to_many :codesecure_projects
  has_many :tst_datas 

class CodesecureProject < ActiveRecord::Base
  has_many :input_abstractions
  has_and_belongs_to_many :tst_definitions

1 个答案:

答案 0 :(得分:4)

经过一些搜索,我实际上找到了答案,感谢这篇博文http://jimcortez.com/blog/?p=9。我只需要从codesecure_projects_tst_definitions表中删除id列。所以迁移现在看起来像这样:

class CreateCodesecureProjectsTstDefinitions < ActiveRecord::Migration
  def self.up
    create_table :codesecure_projects_tst_definitions, :id => false do |t|
      t.references :codesecure_project
      t.references :tst_definition

      t.timestamps
    end
  end

  def self.down
    drop_table :codesecure_projects_tst_definitions
  end
end