Rails:了解唯一性范围吗?

时间:2019-04-25 17:34:08

标签: ruby-on-rails

这可能是一个愚蠢的问题,但是我想确保自己了解具有唯一性模型约束的“作用域”字段。

我遵循了本指南:https://dankim.io/mutual-friendship-rails/,以了解如何在Rails中处理“ Friends”关联。一方面,它讨论了如何进行唯一性约束:

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

这就是说friend_id字段永远不能与相同的user_id字段重复吗?

这还不是因为: validates :user, presence: true, uniqueness: { scope: :friend }

user_id具有重复的friend_id的情况下,用户不应出现多次。还是我误解了scope在这里的工作方式?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

如果您在数据库上设置了索引(这是避免使用唯一性验证避免竞争条件所必需的),您将做完全相同的事情:

    Using OledbConn As New OleDbConnection("Conn String")

        OledbConn.Open()
        Using t_customerCMD As New OleDbCommand("UPDATE t_customer SET [Col1]=@Col1,[Col2]=@Col2 WHERE [codeCust]=@codeCust", OledbConn)
            With t_customerCMD
                .Parameters.Add("@Col1", SqlDbType.VarChar).Value = TextBox1.Text
                .Parameters.Add("@Col2", SqlDbType.VarChar).Value = TextBox2.Text
                .Parameters.Add("@codeCust", SqlDbType.Int).Value = CInt(txtIDCust.Text) 'Assumes ID is integer
                .ExecuteNonQuery()
            End With
        End Using
        OledbConn.Close()

    End Using
End Sub

答案 1 :(得分:2)

差异是在哪个字段中进行检查,因为关系是有方向的(并且使其成为非方向的,因此在文章中创建了逆关系)。

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

另外,对于uniqueness-验证,具有相应的数据库唯一索引总是很有用的(因为验证节省不是原子的)