2009-09-20 68 views
1

我可以創建一個Rails模型,ID從0開始自動遞增,而不是1?怎麼樣?有什麼問題嗎?我查了這裏,似乎我不能:我可以創建一個Rails模型,ID從0開始自動遞增,而不是1?

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001911

如果,因爲它似乎,我不能,有沒有原因,我不能或不應該只是手工爲0的ID分配給這個班的第一個例子?如果我這樣做,Rails會自動爲下一個創建的實例分配一個ID爲1的ID嗎?

回答

2

ActiveRecord的工作原理是每個表都有一個在應用程序域內沒有意義的主鍵列。這是(部分)爲什麼您不必在create_table遷移中定義id列。列名(和類型)可以更改,主要是爲了適應傳統模式,並且多列主鍵很難實現。

在你開始將id賦予領域意義的時候,你開始違反約定,我強烈建議你創建另一個field/property/member-variable/column/what-have - 你要保存這些信息。留下該ID是一個關鍵。

在您描述的用例中,沒有理由認爲您的控制器不應該識別params[:id] == '0'並妥善處理它的特殊情況,切換到您以某種方式識別的「項目部分」,而不是通過id。既然你可能希望每個項目都從0開始,我猜你會添加類似seq的東西,並在你的路線中使用它而不是id,這樣你的參數鍵更有意義。保持當前項目中最高的值,以便在創建新零件時知道要分配的編號。刪除和插入(假定序列事項)完全取決於你...

+0

謝謝。我會放棄這一點。 – 2009-09-20 11:09:41

5

爲什麼你需要這樣做?在Rails模型中,對象ID代表數據庫中唯一的ID,它永遠不會是0(我說的是mysql,也許在postgres中有序列和連續數的例外)。

+0

謝謝Eimantas。我以前很怕那個。 你問我爲什麼需要這樣做?由於模型是「部分」,所以屬於「項目」。第一部分是整個項目的組成部分。該軟件在用戶創建項目時創建它,然後用戶創建自己的較小部分。如果這個部分在瀏覽器的地址欄中顯示爲「/ part/0」給用戶,並且如果用戶定義了2個部分,那麼他們只會看到「/ part/2」屬於自己的。 – 2009-09-20 06:29:59

+0

您可以爲每個零件使用單獨的計數器,而不是使用主鍵。 除此之外,我會保留部分0(對於整個項目)在項目對象本身。 – Eimantas 2009-09-20 06:36:26

+1

我說mysql,auto_increment列的默認值爲0,所以第一條記錄變爲0 + 1 = 1,要將「第一條記錄」值設爲0,您必須將auto_increment值默認爲-1。所以-1 + 1 = 0,我懷疑這是否可能。 – 2009-09-20 06:59:42

0

對於postgres,您可能想看看手動創建表,例如

class MigrationName < ActiveRecord::Migration 
    def self.up 
    execute <<EOF 

create sequence foos_id_seq start 0 increment 1 no cycle; 
create table foos (
    id  integer not null default nextval('foos_id_seq'), 
    ... 
    primary key(id) 
); 
EOF 
    end 

    def self.down 
    execute <<EOF 
drop table foos; 
drop sequence foos_id_seq; 
EOF 
    end 
end 

注意,EOF的位置很重要。

相關問題