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

Posted

技术标签:

【中文标题】在 Ruby on Rails 3.2.14 / Ruby 2.0.0 / PostgreSQL 9.2.4 中使用 activerecord 从序列中检索 nextval【英文标题】:Retrieve the nextval from a sequence using activerecord in Ruby on Rails 3.2.14 / Ruby 2.0.0 / PostgreSQL 9.2.4 【发布时间】:2013-07-30 18:22: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 的提示,将不胜感激!

【问题讨论】:

【参考方案1】:

您可能想使用select_valuesequence_name

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

【讨论】:

select_value 函数非常有用,不需要像 [0]['nextval'] 那样获取。谢谢@kbrock【参考方案2】:

我相信:

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

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

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

【讨论】:

【参考方案3】:

这也有效:

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

【讨论】:

【参考方案4】:

至少对于 Rails 5.1.7,要小心:

ActiveRecord::Base.connection.select_value

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

ActiveRecord::Base.connection.execute

不缓存并按预期工作

【讨论】:

以上是关于在 Ruby on Rails 3.2.14 / Ruby 2.0.0 / PostgreSQL 9.2.4 中使用 activerecord 从序列中检索 nextval的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails如何安装

ruby 在Ruby on Rails中阻止别名

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.

Ruby on Rails - Ruby 中的 KeyCode [关闭]

Ruby on Rails入门篇