2011-08-19 80 views
3

我正在尋找一種方法來創建自動增加自動:id列的方式的列。我可以在模型中以某種方式處理這個問題,但這似乎是kludgey。我還沒有找到任何處理這個問題的股票Rails 3;有沒有可以處理這個問題的寶石?我很驚訝這不是一個選項,因爲Rails處理主鍵列的這種行爲。Rails 3遷移:(非主鍵)列上的自動增量?

+1

主鍵列自動增量是因爲數據庫本身,MySQL或您使用的任何DBMS都會使用每條新記錄遞增主鍵。爲什麼你需要另一個增量列? – Alex

+0

那麼,如果您不打算更改數據庫,則可以在遷移中始終使用「執行」以在原始SQL中添加另一個序列/自動遞增字段。但是,如果你最終會得到兩列都是自動遞增的列,那它們是不是真的是同一列?我意識到一個純粹主義者會在這一點上擊敗我,但是... – jaydel

回答

0

如果你真的認爲你需要這個,你可以在模型中創建一個before_create過濾器來檢查最後一個記錄屬性值,並向其中添加1。感覺雖然黑客攻擊。

+0

我同意 - 它似乎hackish。至於爲什麼我需要這樣的事情:自動增量不僅僅適用於數據庫領域的主鍵。在這種情況下,我添加了一系列步驟,並且不太需要明確地編號,Rails可以爲我做這些。我可能需要寫這個寶石。 – sabat

1

通常使用數據庫序列實現自動遞增列。使用序列計算下一個增量的優點是,從序列中獲取下一個值是原子的。所以如果你有多個進程創建新的元素,序列將確保你的數字是真正獨特的。

序列可以在PostgreSQL裏,Oracle,MySQL等使用,...

如何實現這一點,如果你正在使用例如Postgres的:

  • 選擇序列的下一個值:

    Integer(Operator.connection.select_value("SELECT nextval('#{sequence_name}')"))

  • 創建序列:

    Operator.connection.execute("CREATE sequence #{sequence_name}")

  • 組序列的開始值:

    Operator.connection.execute("SELECT setval('#{sequence_name}', #{new_start_serial})") 
    

希望這有助於。