3

Что такое хороший способ обновить несколько записей с помощью столбцов hstore с помощью activerecord? Сейчас я циклически, обновление и сохранение как это:Rails update_all с hstore

time = Time.now.to_s 
scoped_tasks.each do |task| 
    task.data[:last_checked] = time 
    task.save! 
end 

Есть ли способ сделать это с помощью update_all запроса? Одно решение, которое я видел, выглядит следующим образом:

MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1})) 

Но проблема в том, что переписывает весь столбец, поэтому другие значения теряются. Я также видел это:

MyModel.update_all("data = data || hstore('a', 'blah')") 

Но по какой-то причине я вернусь 0 для значения. Похоже, что он будет работать, только если hstore пуст.

ответ

4

я боролся с тем же вопросом я, вот как я был в состоянии решить:

MyModel.update_all([%(data = data || hstore(?,?)), 'a', 'new_value'])) 

Ядро исправить это обмотать действие update_all в [] и%(). Я все еще пытаюсь выяснить, как%() определяет SET в Postgre SQL, поэтому, если у кого-то есть объяснение, которое было бы полезно для uber.

В моем случае я фактически удалял ключ (действительно, я хотел обновить имя ключа, но сохранил значение). Так что если у кого есть этот вопрос код выглядит следующим образом:

MyModel.update_all([%(data = delete("data",?)), 'a']) 

Я надеялся сделать оба действия в одном вызове, но это было создание действительно нечетные команд в SQL, где второе действие было добавлен как часть WHERE не SET. Еще немного черной магии для меня, но надеюсь, что это помогает ...

0

Если вы используете

MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))

тогда он будет очищен другие значения, и если вы пытаетесь использовать

MyModel.update_all("data = data || hstore('a', 'blah')") его будет работать только в том случае, если в столбце hstore есть значение , поэтому попробуйте использовать комбинацию обоих

if (hstore_column_name).present? MyModel.update_all("data = data || hstore('a', 'blah')") else MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))

Смежные вопросы