1

ActiveRecord を使用して次の疑似コードを実行する方法を見つけようとしています。

rows_updated = UPDATE my_table SET my_column="abc" WHERE id=123
if rows_updated == 0 then INSERT INTO my_table (id, my_column) VALUES (123, "abc")

この理由は、ほとんどの場合、レコードが既に存在するためです。生成されると思われる余分なSELECTクエリを保存したいと思います。first_or_create!

何か案は?

4

3 に答える 3

2

この場合には、(私の観点からは) 別のより洗練された解決策もあります。オプションの 1 つは、このすべてのコードの代わりに置換コマンドを使用することです。

とにかく走れ:

REPLACE INTO my_table (id, my_column) VALUES (123, "abc")

ほとんどの場合、このソリューションは問題なく機能しますが、このコードの負荷が非常に高い場合は、 INSERT .... ON DUPLICATE KEY UPDATEの使用を検討する必要があります。

于 2013-10-13T05:12:52.927 に答える
0

最初に検索または初期化を実行して、ID が存在しない場合にオブジェクトを作成します。次に、新品かどうかを確認します。新しい場合は保存してください。それ以外の場合は更新してください。

obj= find_or_initialize_by_id(obj)
obj.new_record? ? prod.save! : *update the entry*
于 2013-10-13T05:03:36.260 に答える
0

私はすべて高効率のデータベース ソリューションに賛成ですが、その最初のクエリには 1 ~ 2 ミリ秒かかるはずです。更新よりも不思議なことに効率が悪いように見える場合は、データベースが必要とする可能性があるためです。それにアクセスするための物理的な読み取り-更新は、その事前キャッシュの恩恵を受けます。

したがって、この操作がかなり重大なパフォーマンスの問題でない限り、最適化しようとはしません。

于 2013-10-13T08:27:16.190 に答える