Как я могу установить поле метки времени с помощью методов «update» или «update_all» ActiveRecord?

#ruby-on-rails-3 #activerecord

#ruby-on-rails-3 #activerecord

Вопрос:

Это проект Rails 3.

Я просто не могу понять, как это сделать. У меня есть два столбца:

 last_migrated timestamp
migration_message text
  

которое я хотел бы обновить, с условием:

 :subdomain => "someval"
  

и все же все, что я пробовал, потерпело неудачу. Я перепробовал все варианты MyModel.update и MyModel.update_all, о которых я могу подумать. Документация просто по какой-то причине не проникает в мой толстый череп. Пожалуйста, помогите.

Чтобы уточнить, я хочу использовать AR-метод для выполнения следующего:

 update brands
set last_migrated = x,
    migration_message = y
where subdomain = 'someval'
  

Ответ №1:

Вы можете просто использовать where метод, подобный этому:

 Brand.where(:subdomain => 'someval').update_all(:last_migrated => Time.now, :migration_message => 'Some message')
  

Ответ №2:

В итоге я сделал:

   ActiveRecord::Base.connection.execute("update brands set migration_status = 'COMPLETE', migration_message = '', last_migrated = sysdate() where subdomain = '#{self.subdomain}'")
  

что не лучший способ сделать это в AR, и это не способ Rails, но другие вещи, которые я пробовал в AR, не работали (update_all), так что, по крайней мере, это работает.

И поскольку никто не смог ответить на мой вопрос (спасибо, что попробовали amit), и это работает, тогда это останется ответом, пока кто-нибудь не сможет предложить лучший.

Ответ №3:

Вопрос не ясен, но если вы пытаетесь обновить атрибуты модели, тогда используйте:

 ModelName.update_attributes!(:migration_message => "The message", :last_migrated => the_timestamp) if ModelName.subdomain == "someval"
  

где the_timestamp — это объект DateTime или объект Date в зависимости от того, как вы определили его при переносе.

Для использования update_all:

 ModelName.where(<condition>).update_all(:migration_message => "The message", :last_migrated => Time.now)
  

Комментарии:

1. отредактировал ответ, предполагая, что поддомен является другим атрибутом модели. Если это что-то другое, то получите к нему доступ каким-либо образом и аналогичным образом добавьте условие if.

2. Я ищу решение типа «update_all», чтобы мне не приходилось перебирать тысячи записей.

3. Если вы хотите обновить все записи одним и тем же сообщением и временной меткой, попробуйте: ModelName.update_all(«migration_message = ‘Сообщение’, last_migrated = the_timestamp»)

4. Полная документация здесь: ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000343

5. Спасибо, это первое, что я прочитал. К сожалению, я имею дело с обновлением поля метки времени здесь, и вы не можете использовать Time.now без какого-либо формата в поле обновления без символов, например «last_migrated = ‘#{Time.now}'» не работает. И в документах нет примера для выполнения обновления, подобного: :migrated_at => Time.теперь, когда у вас есть несколько столбцов для обновления, плюс условие.