Rails中的多列主键

5

我正在尝试将一个桌面应用程序迁移到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”组成。
那么我是否需要一种多列主键来使Rails关联工作?还是我在走错方向了?
3个回答

10

不是的。主键(像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

有一个名为composite_primary_keys的宝石,可以使用多个列构建主键。

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

但是,如果您能够更改数据模型(这并不总是情况),我建议在每个表中添加一个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

希望这可以帮助到你。

这是我在研究中发现的,我会尝试一下。不幸的是,在我的情况下,我无法更改数据模型... 感谢提示。 - blissini
但实际上,我想要多列主键的唯一原因是可以将(在我的情况下为三个)列作为多对多关联的外键。在我的情况下,我真的需要它们吗? - blissini
如果您无法更改数据模型,那么是的,没有其他方法。否则,您的关系将无法找到正确的行。 - nathanvda
我编辑了我的答案,展示了如何使用composite-primary-keys gem在rails中处理你的数据模型。 - nathanvda
我需要在我的迁移/模式中设置多列键吗?谢谢,这对我帮助很大! - blissini

0
许多人都说过:“如果你与Rails对抗,它会反击。” 真的要尽量避免这种情况,如果你没有一个清晰的数据模型,那么使用Rails会很痛苦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接