Ruby on rails 铁路及;主键/唯一性。如何对主键使用多列?
我的问题和这个完全一样,但我仍然不能100%理解这个问题 假设我有一次模特参观Ruby on rails 铁路及;主键/唯一性。如何对主键使用多列?,ruby-on-rails,validation,primary-key,unique,Ruby On Rails,Validation,Primary Key,Unique,我的问题和这个完全一样,但我仍然不能100%理解这个问题 假设我有一次模特参观 visits id room_id date created_at updated_at 在这种情况下,我希望(room_id,date)成为我的“主键”。现在,这篇文章是说我不需要更改我的主键,而是添加唯一性验证之类的东西 那么我需要什么呢 add_index :visits, [:room_id, :date] 或 ??我是要将“主键”中的每一列都与:id绑定在后面的代
visits
id
room_id
date
created_at
updated_at
在这种情况下,我希望(room_id,date)成为我的“主键”。现在,这篇文章是说我不需要更改我的主键,而是添加唯一性验证之类的东西
那么我需要什么呢
add_index :visits, [:room_id, :date]
或
??我是要将“主键”中的每一列都与:id绑定在后面的代码中,还是像前面的代码一样将所需的列放入[]中
另外,如何进行验证?我不希望:room\u id或:date中的任何一个是唯一的,只希望它们的组合。如何在Rails中做到这一点?根据前面的问题,正确的答案是:
add_index :visits, [:room_id, :date], :unique => true
这段代码防止数据库插入具有相同日期的房间id
。但在模型验证方面,您还需要添加:
validates_uniqueness_of :date, :scope => :room_id
这样,ActiveRecord
可以并且将在尝试插入之前验证记录
注意:将
日期
列名称更改为更具体的名称,如开始日期
,创建日期
,等等。我相信这可能会在将来导致一些潜在问题。谢谢!还有一个问题。如果有3列需要组成一个主列,该怎么办。a、 b和c。add_index:table[:a,:b,:c],unique:true将添加索引。但是关于下一部分。验证的唯一性:b,范围::a,验证的唯一性:c,范围::a??好吧,这确实是一个奇怪的用例。我不知道,也许一些数组符号验证了:date,:scope=>[:room\u id,:other\u id]
的唯一性,但我不确定。
validates_uniqueness_of :date, :scope => :room_id