Ruby on Rails - 如何采用和更新_all

时间:2017-04-04 17:29:08

标签: ruby-on-rails ruby activerecord

我目前正在从

中提取一些信息
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)

但我想知道是否有一种方法可以将两种陈述结合起来

2 个答案:

答案 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

虽然它很复杂。 希望这有助于......