我正在尝试将桌面应用程序迁移到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关联工作吗?或者我在这方向走错了方向?
答案 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很痛苦。