ruby-on-rails – 使用本地散列/数组更新许多记录的Single Postgres查询

我想使用单个查询使用
Ruby散列或数组更新Postgres数据库中的许多记录,而不必遍历每个记录并调用单独的更新.

# {:id => :color}
my_hash = {
  1 => 'red',
  2 => 'blue',
  3 => 'green'
}

我怎么不想这样做,因为它做了三个串行查询:

my_hash.each do |id, color|
  MyModel.where(id: id).update_all(color: color)
end

我该怎么做呢:

MyModel.connection.execute <<-SQL
  UPDATE my_models
    SET color=something
    FROM somehow_using(my_hash)
    WHERE maybe_id=something
SQL

最佳答案 你可以使用案例:

update my_models
    set color = case id
        when 1 then 'red'
        when 2 then 'blue'
        when 3 then 'green'
    end;

或将哈希保存在单独的表中:

create table my_hash (id int, color text);
insert into my_hash values
    (1, 'red'),
    (2, 'blue'),
    (3, 'green');

update my_models m
    set color = h.color
    from my_hash h
    where h.id = m.id;

还有一个选择,如果你知道选择哈希为jsonb的方法:

with hash as (
    select '{"1": "red", "2": "blue", "3": "green"}'::jsonb h
    )
update my_models
    set color = value
    from hash, jsonb_each_text(h)
    where key::int = id;

OP ruby​​-fying klin的第三个选择:

sql = <<-SQL
with hash as (
  select '#{my_hash.to_json}'::jsonb h
)
update my_models
  set color = value
  from hash, jsonb_each_text(h)
  where key::int = id;
SQL

ActiveRecord::Base.connection.execute(sql)
点赞