Извлеките nextval из последовательности, используя activerecord в Ruby on Rails 3.2.14/Ruby 2.0.0/PostgreSQL 9.2.4

Это должно быть просто. Я хочу получить 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')")

но это не сработало.

Любые подсказки на правильном пути (Rails) для получения следующего значения из последовательности в ROR будут очень оценены!

Ответ 1

Я верю

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

- правильное решение. Как я уже сказал в своем первоначальном вопросе, я проверил книгу "Pro Active Record", и это их рекомендуемое решение. Я все еще не совсем уверен, как ActiveRecord создает соединение, или если мне требуется какое-либо обслуживание (например, его закрытие).

В ActiveRecord используется метод next_sequence_number, но он устарел.

Ответ 2

Вероятно, вы хотите использовать select_value и sequence_name:

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

Ответ 3

Это тоже работает:

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