【问题标题】:Rails: Understanding uniqueness scope?Rails:了解唯一性范围?
【发布时间】:2019-04-25 17:34:08
【问题描述】:

这可能是一个愚蠢的问题,但我想确保我理解“范围”字段如何具有唯一性模型约束。

我按照本指南:https://dankim.io/mutual-friendship-rails/ 了解如何在 Rails 中处理“朋友”关联。一方面,它谈到了制定唯一性约束:

validates :friend, presence: true, uniqueness: { scope: :user }(在 friendship 模型中。

所以这是说friend_id 字段不应该与相同的user_id 字段重复,对吗?

这不也可以作为: validates :user, presence: true, uniqueness: { scope: :friend }

如果user_id 具有重复的friend_id,则用户不应出现多次。还是我误解了scope 在这里的工作原理?

谢谢!

【问题讨论】:

  • 我假设用户正在添加好友,这意味着原始验证确保好友对用户来说是唯一的。反之则意义不大,因为错误将附加到user_id,就好像朋友正在添加用户一样,但是是的,无论哪种方式,验证都会以同样的方式失败

标签: ruby-on-rails


【解决方案1】:

你是对的。范围是一种奇特的说法只允许一个双重(用户,朋友)

如果您在数据库上设置索引(这对于避免使用唯一性验证的竞争条件是必要的),您将执行完全相同的操作:

add_index :friendships, [:user_id, :friend_id], unique: true

【讨论】:

  • 您能否详细说明为什么需要索引?我对 Rails 不太熟悉,只见过几次使用过的索引?为什么模型验证还不够?
【解决方案2】:

不同之处在于检查哪个字段,因为关系是有向的(并且为了使其无方向 - 在文章中创建了反向关系)。

在您的示例中 - 对于重复记录,它是无法验证的反向关系

对于uniqueness-validation,拥有相应的数据库唯一索引总是有用的(因为验证保存不是原子的)

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多