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

时间:2012-12-31 23:20:13

标签: ruby-on-rails ruby-on-rails-3

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

6 个答案:

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

您会注意到他们没有采取任何特殊措施来确保唯一性。

他们所做的是仔细考虑创造或打破友谊的互动的每一点。我们需要小心将它们包装在交易中。

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

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

    1. 两个联系人都设置为“已接受”
    2. 如果“朋友”选择打破友谊

      1. 两个联系人都已删除
      2. 这些行动中的每一项都需要在交易中完成。

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

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