繁体   English   中英

Rails:验证独特的友谊关系

[英]Rails: validate unique friendship relationships

我正在按照http://railscasts.com/episodes/163-self-referential-association建立友谊系统。

#Friendship model
id | user_id | friend_id

问题是

  1. 如何使user_idfriend_id的组合唯一? 防止从user_id = 2. friend_id = 1创建user_id = 1, friend_id = 2 user_id = 2. friend_id = 1

  2. 我发现这种模型设计真的很糟糕。 我可以对其进行建模以实际存储2个ID的组合吗? friendship_id_combination = [1, 2] ,然后对其进行验证。

您可以使用以下内容:

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

更新2019:

修改建议:

def users_are_not_already_friends
  if User.where(user_id: friend_id, friend_id: user_id).exist?
    || User.where(user_id: user_id, friend_id: friend_id).exist?
    self.errors.add(:user_id, 'Already friends!')
  end
end

而且我强烈建议您根据复合user_idfriend_id添加数据库约束(唯一索引):

CREATE UNIQUE INDEX users_user_id_friend_id_key ON users (user_id, friend_id);

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

@user.friends

而且,如果您不想添加两个键,则需要触发两个查询以查找相同的详细信息。 一个用于您的朋友,另一个用于请求您成为朋友的人。

是。 您正在沿着正确的道路思考。 也许最简单的解决方案是使用数据库表通过使ID组合成为唯一索引来创建验证。

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

我认为这会做您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM