我有一个Rails应用程序,其中有一个名为friendrequests
的表。它看起来像这样:
user1_id:integer user2_id:integer hasaccepted:boolean
我正在创建添加朋友的选项,但是朋友请求只能发送一次。所以你不能在数据库的数据中有这样的东西:
user1_id | user2_id | hasaccepted
1 | 2 | false
1 | 2 | false
或
user1_id | user2_id | hasaccepted
1 | 2 | false
2 | 1 | false
user1_id / user2_id组合必须是唯一的,而不是列本身,所以这是可能的:
user1_id | user2_id | hasaccepted
1 | 2 | false
1 | 3 | false
是否可以在模型中定义它?我怎么能这样做?
答案 0 :(得分:6)
对于第一种情况,请在FriendRequest
模型中使用validates_uniqueness_of(:user1_id, :scope => :user2_id)
。您可能还需要反向。对于第二种情况,我会覆盖#validate
中的FriendRequest
并在那里进行检查(有关该方法应如何执行的详细信息,请参阅API docs。)
答案 1 :(得分:0)
试试这个:
validates_each :user1_id, :user2_id do |record, attr, value|
if FriendRequest.exists?( :user1_id => [record.user1_id, record.user2_id],
:user2_id => [record.user1_id, record.user2_id])
record.errors.add attr, 'Duplicate friend request'
end
end
答案 2 :(得分:0)
我还要确保为数据库本身添加一个索引。不能依赖模型中的验证检查来保持数据完整性,因为并发系统中存在边缘情况,验证不会保护您。
例如,可以在验证检查之后但在创建新记录之前插入另一条记录: