我有一个模型Friendship
,其中:friend_id
也是外键:user_id
friendships
id | user_id | friend_id
我知道验证两个字段的唯一性就是这样的
validates :user_id, :uniqueness => {:scope => :friend_id}
但有没有办法验证
user_id = 1, friend_id = 3
user_id = 3, friend_id = 1
所以只有
存储了user_id = 1, friend_id = 3
?
答案 0 :(得分:2)
更仔细地阅读问题我现在认为它确实是
validates :friend_id, :uniqueness => {:scope => :user_id}
答案 1 :(得分:1)
这是一个难题。
如何建立对称关系?
上次我这样做时,我认为它实际上并不是对称的。
有关如何对Disapora's Contact
class
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
您会注意到他们没有采取任何特殊措施来确保唯一性。
他们所做的是仔细考虑创造或打破友谊的互动的每一点。我们需要小心将它们包装在交易中。
基本上,当用户发送“朋友请求”
时当“朋友”接受此“请求”时
如果“朋友”选择打破友谊
这些行动中的每一项都需要在交易中完成。
只要这些交易是正确的,我们就不应该有单向的友谊。
答案 2 :(得分:1)
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
答案 3 :(得分: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
答案 4 :(得分:0)
所以我想到了解决这个问题的方法,但它非常混乱
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}
答案 5 :(得分:0)
我会尝试:
validate :unique_relationship
def unique_relationship
(user_id.to_s + friend_id.to_s).uniq
end