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
你会注意到他们没有做任何特别的事情以确保独特性。
他们所做的是仔细考虑创造或打破友谊的互动的每个方面。 我们需要小心将它们包装在事务中。
基本上,当用户发送“朋友请求”时
- 我们创建一个从“用户”到“朋友”的联系人,其状态为“待定”
- 我们创建从“朋友”到“用户”的联系人,状态为“已请求”
当“朋友”接受这个“请求”时
- 两个联系人都设置为“已接受”
如果“朋友”选择打破友谊
- 两个联系人都被删除
这些操作中的每一个都需要在事务中完成。
只要这些交易是正确的,我们就不应该有单向的友谊。
多一个!
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