使用 ActiveRecord 进行类似重复查询的最佳实践
Best practice for similar repeated queries using ActiveRecord
我有几个简单的查询,但不确定最佳做法是什么。
我用两种方式编写了它们,结果相同。哪个是首选?或者有第三种更好的方法吗?
更简洁:
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)
该代码段的目的是进行一次性回填。
没有更多上下文,您的第一个示例更容易理解。
假设您想触摸每条记录,如果您回填所有记录,则可能会提高清晰度(虽然会慢一点),然后只回填子集:
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)
如果想一次性完成statement/query,可以这样写:
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,这将立即更新所有记录:
UPDATE "fruits"
SET "prepackaged_raw_enabled" = "fruits"."id" NOT IN (571, 572)
我有几个简单的查询,但不确定最佳做法是什么。
我用两种方式编写了它们,结果相同。哪个是首选?或者有第三种更好的方法吗?
更简洁:
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)
该代码段的目的是进行一次性回填。
没有更多上下文,您的第一个示例更容易理解。 假设您想触摸每条记录,如果您回填所有记录,则可能会提高清晰度(虽然会慢一点),然后只回填子集:
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)
如果想一次性完成statement/query,可以这样写:
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,这将立即更新所有记录:
UPDATE "fruits"
SET "prepackaged_raw_enabled" = "fruits"."id" NOT IN (571, 572)