簡體   English   中英

在RoR模式中添加主鍵約束

[英]Add a primary key constraint in a RoR schema

在我們的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 DB,但如果確實需要,可以備份它,並將數據插入新的架構中。

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

如果要在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"

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM