使用Ruby on Rails 3.2.14 / Ruby 2.0.0 / PostgreSQL 9.2.4中的activerecord从序列中检索nextval

时间:2013-07-30 18:22:13

标签: ruby-on-rails-3.2 rails-activerecord postgresql-9.2 rails-postgresql

这应该很简单。我想检索序列的nextval ...它不是默认值...它不是主键...它不是外键。在极少数情况下,我需要一个用户提供的值的序列号。

我尝试了以下内容:

@nextid = ActiveRecord::Base.connection.execute("SELECT nextval('xscrpt_id_seq')")

我得到的是:

#<PG::Result:0x007fe668a854e8 @connection=#<PG::Connection:0x00000003aeff30>>

并使用

@nextid[0]["nextval"]

我可以获得正确的值,但这似乎不是解决问题的正确方法。我搜索过,我读了“Pro Active Record”,据说使用:

M_script.find_by_sql("SELECT nextval('xscript_id_seq')")

但是,这没效果。

在ROR中从序列中检索nextval的“正确”(Rails方式)的任何提示都将非常感激!

4 个答案:

答案 0 :(得分:8)

我相信

ActiveRecord::Base.connection.execute("SELECT nextval('xscrpt_id_seq')")

是正确的解决方案。正如我在原始问题中所说,我检查了“Pro Active Record”这本书,这是他们推荐的解决方案。我仍然不确定ActiveRecord如何建立连接,或者我是否需要进行任何维护(例如关闭它)。

ActiveRecord曾经有过“next_sequence_number”方法,但已被弃用。

答案 1 :(得分:7)

您可能想要使用select_valuesequence_name

Xscrpt.connection.select_value("select nextval('#{Xscrpt.sequence_name}')").to_i

答案 2 :(得分:1)

这也有效:

 @seq = Smodelname.find_by_sql(" select seq_name.nextval as id from dual ")[0][:id]

答案 3 :(得分:0)

至少在 Rails 5.1.7 中,要小心:

ActiveRecord::Base.connection.select_value

仅在第一次调用时增加事务中的序列。当您多次执行它时,您将始终获得相同的值,并且序列不会递增。

ActiveRecord::Base.connection.execute

不缓存并按预期工作