我目前正在从
中提取一些信息model_hash = Model.where(id: some_id, name: some_name).pluck(:name, :id).to_h
我想在它看到的每个模型上更新另一个属性。我知道我可以写:
Model.where(id: some_id, name: some_name).update_all(last_import_date: DateTime.now)
但我想知道是否有一种方法可以将两种陈述结合起来
答案 0 :(得分:0)
ActiveRecord pluck
生成SQL SELECT
查询,而update_all
生成SQL UPDATE
查询。对于某些SQL方言,您可以在UPDATE
期间检索数据,例如在PostgreSQL you can use RETURNING
中指定要从更新的行返回的值。在你的情况下,例如:
UPDATE models
SET last_import_date = '2017-04-04 20:49:07'
WHERE name = 'Some Name'
RETURNING id;
ActiveRecord不支持这一点,可能是因为它高度依赖方言,而ActiveRecord打算从这些差异中抽象出来。
答案 1 :(得分:0)
我认为不需要这样的东西。通常使用您的代码。但如果您真的想在一个查询中执行此操作,则可以尝试此操作。
model_hash = Map.where(id: some_id, name: some_name).map { |x| x.update_attributes(last_import_date: DateTime.now) ? [x.id, x.some_name] : ["value","nil"] }.to_h
虽然它很复杂。 希望这有助于......