2015-08-23 21 views
0

我今天已經研究了有關此主題的幾個問題。我知道,我可以在遷移中使用t.references添加參考。但是,如果一個表具有非整數主鍵,我該如何添加對該列的引用?在rails移植中添加對非整數列的引用

我有這個定義

create_table :sessions, id: false do |t| 
     t.string :session, primary_key: true, limit: 10 

     t.timestamps null: false 
    end 

如何添加到session列的引用(名稱無關緊要這裏),這是從另一個表遷移的字符串表。我用t.references進行了測試,但只是添加了一個整數列。我知道我可以使用add column。但如何直接從create_table方法做到這一點?

澄清重複的標誌
這個問題被標記爲this question重複,但實際上並非如此。因爲我沒有詢問使用非默認非整數主鍵設置表,因爲我已經設置了該表。我在詢問從另一個表中引用這種類型的表。

+0

可能重複[rails非整數主鍵](http://stackoverflow.com/questions/23846090/rails-non-integer-primary-key) – ABMagil

+1

@ABMagil我不認爲它是Anwar以來的重複詢問*參考*到非整數主鍵 - 而不是主鍵本身。 – eirikir

回答

2

您不需要使用引用幫助程序,而需要使用字符串類型,並添加索引以加快查找速度。如果你的另一模式是「記錄」:

rails generate migration AddSessionIdToRecords session:string:index 

這應該產生像這樣一個遷移:

def change 
    add_column :records, :session_id, :string 
    add_index :records, :session_id 
end 

由於您使用非常規的命名,你需要指定的主鍵模型和關係定義:

class Session < ActiveRecord::Base 
    self.primary_key = "session" 

    has_many :records, primary_key: "session" 
end 

class Record < ActiveRecord::Base 
    belongs_to :session, primary_key: "session" 
end 
+0

我的設置幾乎是這樣,但我認爲,它是'foreign_key:「session」'而不是'primary_key:「session」'。你應該檢查 – Anwar

+0

你在另一張桌子上的名字是什麼(「'records'」)?這就是foreign_key,所以如果你將它命名爲'session',那麼foreign_key將會是''session「' – eirikir

+0

問題是我必須使用foreign_key選項,而不是primary_key選項 – Anwar

0

我的結論抵達,如果不利用在軌4.2推出foreign_key,我不能真正引用另一列,僅創建索引this answer from eirikir建議。

從軌4.2,我可以使用外鍵這樣

在會話表遷移

create table :sessions, id: false do |t| 
    t.string "session", primary_key: true 
    t.timestamp null: false 
end 

對於記錄表引用session主鍵

create table :records do |t| 
    t.string "session", null: false 
    .. 
    .. # other attributes 
end 

add_index :records, :session 
add_foreign_key :records, :sessions, column: :session, primary_key: :session 

在這裏, column:選項修復,我想在哪一列創建外鍵和primary_key:選項修復,主鍵參考表,這裏是session

1

其實,你不必在課堂會話&記錄

def change 
    add_column :records, :session_id, :string 
    add_index :records, :session_id 
    add_foreign_key :records, :sessions, column: :session_id, primary_key: "your_primary_key_name_in_sessions_table" 
end 

添加primary_key,這將是所有。

+0

爲什麼我應該使用':session_id'作爲'string'? – Anwar