2

我有一个模型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存储?

4

6 回答 6

2

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

validates :friend_id, :uniqueness => {:scope => :user_id}
于 2013-01-01T01:13:18.553 回答
1

这是个难题。

如何建模对称关系?

上次我这样做时,我决定实际上它不是对称的。有关如何建模的想法,请查看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. 两个联系人都被删除

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

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

于 2013-01-01T01:04:54.100 回答
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
于 2013-01-01T01:08:20.437 回答
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
于 2013-01-01T01:15:33.047 回答
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}
于 2013-01-01T00:46:22.723 回答
0

我会尝试:

validate :unique_relationship

def unique_relationship
  (user_id.to_s + friend_id.to_s).uniq
end
于 2013-01-01T00:50:07.363 回答