rails中的多列主键

时间:2011-11-20 12:48:43

标签: ruby-on-rails database foreign-keys associations primary-key

我正在尝试将桌面应用程序迁移到rails(也处理相当老式的现有数据库)。问题是我在一列中没有唯一的ID,但它是表的三列,保证了记录的唯一性。

鉴于我有三张桌子:

authors
  author_name,
  author_letter,
  author_nr1,
  author_nr2
  ...

titles
  titel_nr,
  titel_name,
  ...

author_titles
  titel_nr,
  author_letter,
  author_nr1,
  author_nr2

作者的“主键”包括author_letter,author_nr1,author_nr2 here。

所以我需要在这里使用多列主键来使rails关联工作吗?或者我在这方向走错了方向?

3 个答案:

答案 0 :(得分:11)

没有。主键(与rails默认)是记录的ID。

此外,您可以设置像

这样的唯一键
    add_index :users, [:merchant_id, :email], unique: true
    add_index :users, [:merchant_id, :login], unique: true

这会影响您的数据库。要捕获Rails中的唯一性,您需要写入模型:

  validates_uniqueness_of :email,    scope: :merchant_id
  validates_uniqueness_of :login,    scope: :merchant_id

答案 1 :(得分:0)

存在一个名为composite_primary_keys的gem,它允许使用多个列构建主键。

所以,是的,您可以使用多列主键。

但是,如果您能够更改数据模型(并非总是如此),我建议为每个表添加一个列ID,因为这将使您的生活更轻松(并且性能也更高)。

[编辑]

使用composite_primary_keys的类定义将如下所示

class Author
  set_primary_keys :author_letter, :author_nr1, :author_nr2
  has_many :titles, :through => :author_title
end

class Title
  set_primary_key :title_nr
end

class AuthorTitle
  belongs_to :title, :foreign_key => :title_nr
  belongs_to :authori, :foreign_key => [:author_letter, :author_nr1, :author_nr2]
end

希望这有帮助。

答案 2 :(得分:0)

许多人说:“如果你打Rails,它就会反击”。 真的试着避免这种情况,如果你没有干净的数据模型,那就是使用rails很痛苦。