我有幾個簡單的查詢,我不確定最佳做法是什么。
我用兩種產生相同結果的方式撰寫了它們。哪個是首選?還是有第三種更好的方法?
更簡潔:
Fruit.where(id: NOT_PREPACKAGED_RAW_FRUIT_IDS).update_all(prepackaged_raw_enabled: false)
Fruit.where.not(id: NOT_PREPACKAGED_RAW_FRUIT_IDS).update_all(prepackaged_raw_enabled: true)
更詳細:
fruits = Fruit.all
not_prepackaged = fruits.where(id: NOT_PREPACKAGED_RAW_FRUIT_IDS)
prepackaged = fruits - not_prepackaged
not_prepackaged.update_all(prepackaged_raw_enabled: false)
prepackaged.update_all(prepackaged_raw_enabled: true)
該片段的目的是進行一次性回填。
uj5u.com熱心網友回復:
“最佳”方式是主觀的。但是,如果您想在單個陳述句/查詢中執行此操作,則可以這樣撰寫:
Fruit.update_all(prepackaged_raw_enabled:
Fruit.arel_table[:id].not_in(NOT_PREPACKAGED_RAW_FRUIT_IDS)
)
如果NOT_PREPACKAGED_RAW_FRUIT_IDS = [571, 572],則將轉換為以下 SQL,該 SQL 將立即更新所有記錄:
UPDATE "fruits"
SET "prepackaged_raw_enabled" = "fruits"."id" NOT IN (571, 572)
uj5u.com熱心網友回復:
沒有更多背景關系,您的第一個示例更容易理解。假設您想觸摸每條記錄,如果您回填所有記錄,那么它可能會提高清晰度(雖然會慢一點),然后只是子集:
Fruit.update_all(prepackaged_raw_enabled: true)
Fruit.where(id: NOT_PREPACKAGED_RAW_FRUIT_IDS).update_all(prepackaged_raw_enabled: false)
或者,也許你的設定反過來會更安全(盡管雙重否定并不理想):
Fruit.update_all(prepackaged_raw_enabled: false)
Fruit.where.not(id: NOT_PREPACKAGED_RAW_FRUIT_IDS).update_all(prepackaged_raw_enabled: true)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471100.html
下一篇:RORrspec-rails錯誤:ActiveRecord:連接到“localhost”(::1)的服務器,埠5432失敗:fe_sendauth:未提供密碼
