这应该很简单。我想检索序列的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方式)的任何提示都将非常感激!
答案 0 :(得分:8)
我相信
ActiveRecord::Base.connection.execute("SELECT nextval('xscrpt_id_seq')")
是正确的解决方案。正如我在原始问题中所说,我检查了“Pro Active Record”这本书,这是他们推荐的解决方案。我仍然不确定ActiveRecord如何建立连接,或者我是否需要进行任何维护(例如关闭它)。
ActiveRecord曾经有过“next_sequence_number”方法,但已被弃用。
答案 1 :(得分:7)
您可能想要使用select_value
和sequence_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
不缓存并按预期工作