在 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_value
和sequence_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 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby?
ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.