12

これはとてもシンプルなはずです。シーケンスの 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 の方法) に関するヒントをいただければ幸いです。

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_valueおそらくandを使用したいでしょう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 に答える