【问题标题】:Rails & Primary Keys / Uniqueness. How do you use multiple columns for a primary key?Rails 和主键/唯一性。如何使用多个列作为主键?
【发布时间】:2014-05-16 17:25:31
【问题描述】:

我的问题与这个 (multicolumn primary keys in rails) 完全相同,但我仍然没有 100% 理解。

假设我有一个模特来访

visits
    id
    room_id
    date
    created_at
    updated_at

在这种情况下,我希望 (room_id, date) 成为我的“主键”。现在,这篇文章是说我不需要更改我的主键,只需添加唯一性验证和其他东西?

我也需要

add_index :visits, [:room_id, :date]

add_index :visits, [:id, :room_id]
add_index :visits, [:id, :date]

?我是像后一个代码一样将我想要在“主键”中的每一列与 :id 绑定,还是像前一个代码一样将我想要的列放入 [] 中。

另外,我该如何进行验证?我不希望 :room_id 或 :date 是唯一的,只有它们的组合。我如何在 Rails 中做到这一点?

【问题讨论】:

    标签: ruby-on-rails validation primary-key unique


    【解决方案1】:

    根据上一题,正确的是:

    add_index :visits, [:room_id, :date], :unique => true
    

    这段代码阻止数据库插入具有相同dateroom_id。但在模型验证方面,还需要补充:

    validates_uniqueness_of :date,    :scope => :room_id
    

    这样,ActiveRecord 可以在尝试插入之前验证记录。

    P.S.:将 date 列名称更改为更具体的名称,例如 start_datecreation_date 等。我相信这可能会在未来引起一些潜在问题。

    【讨论】:

    • 谢谢!还有一个问题。如果需要 3 列来组成一个主列怎么办。 a、b 和 c。 add_index :table [:a, :b, :c], unique: true 将添加索引。但关于下一部分。 validates_uniqueness_of :b, 范围: :a, validate_uniqueness_of :c, 范围: :a??
    • 嗯,这肯定是一个奇怪的用例。我不知道,也许是一些数组符号validates_uniqueness_of :date, :scope => [:room_id, :another_id],但我不确定。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多