Rails 3两个字段唯一性合并时的validation

我有一个模型Friendship ,其中:friend_id也是一个外键:user_id

 friendships id | user_id | friend_id 

我知道validation两个字段的唯一性就是这样的

 validates :user_id, :uniqueness => {:scope => :friend_id} 

但有没有办法validation

 user_id = 1, friend_id = 3 user_id = 3, friend_id = 1 

这样只存储user_id = 1, friend_id = 3

 validate :relationship_uniqueness def relationship_uniqueness existing_record = Friendship.find(:first, :conditions => ["user_id = ? AND friend_id = ?", user_id, friend_id]) unless existing_record.blank? errors.add(:user_id, "has already been saved for this relationship") end end 

更仔细地阅读这个问题我现在认为这是真的

 validates :friend_id, :uniqueness => {:scope => :user_id} 

这是一个难题。

你如何建立对称关系的模型?

上次我这样做时,我认为它实际上并不是对称的。 有关如何对Disapora的Contact类进行建模的想法

 class Contact < ActiveRecord::Base belongs_to :user belongs_to :person validates :person, :presence => true validates_presence_of :user validates_uniqueness_of :person_id, :scope => :user_id end 

你会注意到他们没有做任何特别的事情以确保独特性。

他们所做的是仔细考虑创造或打破友谊的互动的每个方面。 我们需要小心将它们包装在事务中。

基本上,当用户发送“朋友请求”时

  1. 我们创建一个从“用户”到“朋友”的联系人,其状态为“待定”
  2. 我们创建从“朋友”到“用户”的联系人,状态为“已请求”

当“朋友”接受这个“请求”时

  1. 两个联系人都设置为“已接受”

如果“朋友”选择打破友谊

  1. 两个联系人都被删除

这些操作中的每一个都需要在事务中完成。

只要这些交易是正确的,我们就不应该有单向的友谊。

多一个!

 def unique_relationship? self.class.where("(user_id = ? and friend_id = ?) or (user_id = ? and friend_id = ?)", user_id, friend_id, friend_id, user_id).empty? end 

所以我想到了解决这个问题的方法,但它非常混乱

 friendships id 1 friend_lists id | friendship_id | user_id 1 | 1 | 1 2 | 1 | 3 

这样,我必须确保一个friendship_id只能在friend_lists输入两次,并且确实如此

 validates :friendship_id, :uniqueness => {:scope => :user_id} 

我会尝试:

 validate :unique_relationship def unique_relationship (user_id.to_s + friend_id.to_s).uniq end