12

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

我尝试了以下方法:

@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')")

但是,那没有用。

任何关于“正确”(Rails 方式)从 ROR 中的序列中检索 nextval 的提示,将不胜感激!

4

4 回答 4

10

我相信:

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

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

ActiveRecord曾经有一个next_sequence_number方法,但已被弃用。

于 2013-07-31T15:04:07.703 回答
10

您可能想使用select_valueand sequence_name

Xscrpt.connection.select_value("select nextval('#{Xscrpt.sequence_name}')").to_i
于 2016-01-21T20:30:02.110 回答
1

至少在 Rails 5.1.7 中,要小心:

ActiveRecord::Base.connection.select_value

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

ActiveRecord::Base.connection.execute

不缓存并按预期工作

于 2021-06-05T06:22:31.173 回答
1

这也有效:

 @seq = Smodelname.find_by_sql(" select seq_name.nextval as id from dual ")[0][:id]
于 2018-05-15T08:37:00.337 回答