Rails模型和独特的组合

时间:2010-02-18 18:44:48

标签: ruby-on-rails model

我有一个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

是否可以在模型中定义它?我怎么能这样做?

3 个答案:

答案 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)

我还要确保为数据库本身添加一个索引。不能依赖模型中的验证检查来保持数据完整性,因为并发系统中存在边缘情况,验证不会保护您。

例如,可以在验证检查之后但在创建新记录之前插入另一条记录:

  1. 模型A:验证(通过)
  2. 模型B:验证(通过)
  3. 模型A:插入(成功)
  4. 模型B:插入(成功:错误数据)