【发布时间】:2014-07-20 13:43:40
【问题描述】:
我正在尝试在我的 postgresql 表中添加一个基于整数的自动递增列,然后通过活动记录访问它。它不断被活动记录设置为 NULL。
明显的方法:
add_column :table_name, :id_name, :primary_key
这不起作用,因为表已经有一个主键。
接下来我尝试将其添加到 Active Record 迁移的上游部分:
execute("ALTER TABLE table_name ADD id_name SERIAL;")
这在创建表时非常有效,如果我通过数据库直接创建一个新条目,id_name 会按照人们的希望设置。但是,如果我使用 .new & .save 或 .create 通过 ActiveRecord 创建一个新条目,它会在尝试将 id_name 设置为 null 时爆炸。
我也试过了:
execute("CREATE SEQUENCE table_name_id_name_seq;")
execute("ALTER TABLE table_name ADD id_name INTEGER DEFAULT NEXTVAL('table_name_id_name_seq');")
execute("ALTER SEQUENCE table_name_id_name_seq OWNED BY table_name.id_name;")
这允许 .new & .save 以及 .create 进行条目,但结果的 id_name 为 null。
有什么方法可以说服 Rails 不要用 null 覆盖默认的 db 值?
【问题讨论】:
-
你看过 gem "sequenced" (github.com/djreimer/sequenced)。完全符合您的要求...
-
通过 PG gem 添加条目会导致 id_name 设置正确,只要我通过 DEFAULT 而不是 null。
-
@Danny 感谢您的链接 - 浏览它。如果可能的话,我希望增量发生在 db 层。
-
@Danny 这对新行很有用,但是所有旧行都保留为空。我需要做一些事情,在表中的每一行(包括新行)上创建 id。不过还是谢谢你。这几乎是一个解决方案!
标签: ruby-on-rails postgresql activerecord