在我们的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数据库上添加这样的约束是不可能的,但我准备删除它并在需要时重新创建它。 如果可能的话,我想避免丢弃MySQL数据库,但如果确实有必要,我可以备份它并将数据插入新的模式中。
最好的办法是什么? (Rails V3.2.6)
答案 0 :(得分:0)
如果你想在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_key
选项
create_table "projects", :primary_key => 'your_id' do
...
end
或,
如果您只想确保单一性,可以使用ActiveRecord验证:
validates_uniqueness_of :your_id, :message => "ID needs to be unique"
希望这有帮助。