Rails:验证独特的友谊关系

时间:2015-03-18 13:38:39

标签: ruby-on-rails ruby

我正在关注http://railscasts.com/episodes/163-self-referential-association 建立友谊体系。

#Friendship model
id | user_id | friend_id

问题是

  1. 如何使user_idfriend_id的组合独一无二? 阻止从user_id = 1, friend_id = 2

  2. 创建user_id = 2. friend_id = 1
  3. 我发现这个模型设计非常糟糕。我可以对它进行建模以实际存储2个ID的组合吗?与friendship_id_combination = [1, 2]类似,然后验证它。

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

validate :users_are_not_already_friends

def users_are_not_already_friends
  combinations = ["user_id = #{user_id} AND friend_id = #{friend_id}",
  "user_id = #{friend_id} AND friend_id = #{user_id}"]
  if User.where(combinations.join(' OR ')).exists?
    self.errors.add(:user_id, 'Already friends!')
  end
end

答案 1 :(得分:0)

为什么需要这种独特的组合。考虑是否要获取单个用户的朋友,然后在当前场景中,您可以使用简单关联找到它。

@user.friends

如果您不想添加两个密钥,则需要触发两个查询以查找相同的详细信息。一个给你的朋友和其他请求你作为朋友的人。

答案 2 :(得分:0)

是。你在思考正确的道路。也许最简单的解决方案是使用数据库表来创建验证,方法是将ID组合作为唯一索引。

class CreateFriendshipsUnq < ActiveRecord::Migration
  def change
    add_index :friendships, [:user_id, :friend_id], unique: true
  end
end

我认为这会做你想要的。