2011-08-19 82 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})") 
    

希望这有助于。