【问题标题】:Add a primary key constraint in a RoR schema在 RoR 模式中添加主键约束
【发布时间】:2012-07-30 10:02:47
【问题描述】:

在我们的 Web 应用程序中,我们的表格在 id 字段中保存了一个“GUID”ID。 通过调查用于创建数据库的实际 SQL 代码,我们看到我们的 ID 实际上并没有作为主键延迟。似乎没有强制执行唯一性,也没有创建索引。

这感觉很糟糕,所以我们想解决这个问题。我们的目标只是将我们的 ID 字段设置为“主键”

这是我们的 schema.rb 的示例

 create_table "projects", :id => false, :force => true do |t|
    t.string   "id"
    t.string   "name"
    t.string   "objective"
    t.datetime "created_at",                              :null => false
    t.datetime "updated_at",                              :null => false
    t.string   "client_account_id"
    t.string   "default_project_name"
    t.boolean  "quota_exceeded",       :default => false, :null => false
  end

在开发中,我们使用 SQLite3 数据库,而在生产中,我们依赖 MySQL。

我知道不可能在现有的 SQLite3 DB 上添加这样的约束,但我准备删除它并在需要时重新创建它。 如果可能,我想避免删除 MySQL DB,但如果确实需要,我可以备份它并将数据插入新模式。

最好的方法是什么? (Rails V3.2.6)

【问题讨论】:

    标签: mysql ruby-on-rails sqlite primary-key


    【解决方案1】:

    如果你想在 Rails 中设置一个非标准的主键,你应该看看composite_primary_keys gem

    在您的迁移使用中,就像您已经做过的那样,

    :id => false 
    

    然后在您的模型中尝试以下操作

    require 'composite_primary_keys'
    class User < ActiveRecord::Base
      self.primary_keys = :your_custom_id
    end
    

    gem 覆盖了默认的 Rails 行为,因此您要使用的键由 create 语句设置。这样,您也可以根据需要使用复合主键。

    另一种方法是在迁移中使用 :primary_keyoption

    create_table "projects", :primary_key => 'your_id' do 
      ...
    end
    

    或者,

    如果你只是想确保唯一性,你可以像这样使用 ActiveRecord 验证:

    validates_uniqueness_of :your_id, :message => "ID needs to be unique"
    

    希望这会有所帮助。

    【讨论】:

    • 我知道这对实际的复合键有什么用处,但在我的情况下,这与使用 : :validate_uniqueness_of :id 有何不同?如果可能的话,我想在数据库级别而不是模型级别强制执行唯一性。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2016-05-14
    • 2017-06-10
    • 2015-11-29
    • 2021-02-16
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多