2013-01-17 54 views
0

我有用腳手架創建的id列的問題。我產生了支架與下面的命令:在'rails generate scaffold scaffoldname name:string id:integer'之後將id更改爲rowid

rails generate scaffold scaffoldname name:string id:integer 

我使用的ID列,我想用collection_select的下拉菜單中使用的關係。之後,我意識到生成一個id是不必要的,因爲rails爲每個表自動創建的id。

當我想打電話給相關的表與自創建ID這當然是可能的與

class.relatedClass.id

後來我才意識到,這個命令也可以在一個表,其中軌道創建的ID ,儘管該列在表中被命名爲「rowid」。

所以我認爲應該可以刪除自我創建的ID列與遷移。我想過的方式是,導軌應該自動使用關係的rowid。但是在刪除自己創建的ID之後,就會出現錯誤。 Rails拒絕自動使用'rowid'列,儘管它會在腳手架命令中沒有指定id列的情況下自動使用它。

如何在以後使用自己創建的rowid調用class.relatedClass.id時刪除自己創建的id列?在軌道終端

+0

生成命令中的「創建」是否有錯誤? –

回答

2

運行這一點 -

rails g migration remove_id_from_scaffoldname id:integer 

rails g migration add_rowid_to_scaffoldname rowid:integer 

這將創建兩個遷移文件 - 一個去除id場和其他添加rowid領域。

然後在軌道終端上運行這一點 -

rake db:migrate 

另外請注意,軌道會自動創建id場,但不是作爲rowid主鍵。要限制導軌使用您定義的主鍵,你必須明確這樣像這樣在這裏定義 -

您的遷移文件 -

create_table :tablename, :primary_key => :rowid do |t| 
# ... 
end 

模型 -

class ModelName< ActiveRecord::Base 
    self.primary_key = "rowid" 
    ... 
end 

注:這是一個很好的做法,使用軌自動生成id作爲主鍵,除非另有你有AV也沒有理由這麼做。

+0

好的,我想我明白了。我的失敗在於,我認爲rails生成的id列是'rowid',當我使用SQliteManager查看它時,我可以在所有表​​中看到它。但似乎這個列只是excel(1..n)中的行標籤,而不是從rails本身創建的。我現在看到在SQliteManager中創建輸出的sql查詢:'SELECT rowid,* FROM「testmodels」;'。感謝提示rowid不是rails生成的id! – coderuby

+1

這是非常棒的答案,非常感謝。 –

1

您可以執行的一件事是運行向下遷移,從遷移中刪除id字段並再次運行向上遷移。

當您運行生成,它創建了一個遷移文件是這樣的:

db/migrate/20130117134712_create_scaffoldnames.rb 

如果你做分貝的LS /遷移,您會看到其他遷移

> ls db/migrate 
20130114170853_create_server_requests.rb 
20130117134712_create_scaffoldnames.rb 

您可以運行通過運行DB向下遷移20130117134712_create_scaffoldnames:遷移到以前的版本

> rake db:migrate VERSION=20130114170853 

然後編輯您想要的腳手架名稱遷移方式,然後再運行db:migrate。

我一直這樣做。訣竅是在我的開發環境中捕獲這些修改,這樣我就可以完成這些工作。

另外,如果你抓住它足夠早,你可以運行

rails destroy scaffold scaffoldname 

撤消支架產生。

+0

爲什麼在'rails generate'命令中包含'id:integer'?難道這不會導致某種不需要的重複? –

+0

也許這是誤導,因爲它不是我答案的一部分。我在評論這個問題的創造是一個印刷錯誤。我會編輯我的帖子更清晰。 –

+0

的確,「創造」是一個印刷錯誤。對不起!將糾正它! – coderuby