#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.теперь, когда у вас есть несколько столбцов для обновления, плюс условие.