ruby-on-rails - rails : validate unique friendship

我正在关注 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

  2. 创建 user_id = 1, friend_id = 2
  3. 我觉得这个模型设计真的很糟糕。我可以对其建模以实际存储 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);

关于ruby-on-rails - rails : validate unique friendship relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29123620/

相关文章:

c# - 使用 Roslyn 时如何验证方法中的参数类型

html - 高度以像素为单位,而不是百分比

regex - R - 从文件中读取行的部分匹配

r - Error in `[<-` (`*tmp*` , , 下标越界 下标越界

netlogo - 如何在 Netlogo 中的海龟之间创建多个链接

qt - 如何从 QT 中的 RTSP 流解析 ONVIF 元数据?

can-bus - 使用 ELM327 接收 CAN 报文时的流量控制报文

doctrine-orm - Doctrine2 会选择所有关联的所有字段(来自查询的 JOINS)

clojure - 我如何获得 clojure 中的单元测试列表?

c# - 使用 C# 的条件 JSON 序列化