2016-04-19 6 views
3

Я ищу способ в консоли rails найти любые значения, которые заканчиваются с определенной строкой, и удалить эту строку из значения.Как найти и удалить часть строки в Rails Console - ActiveRecord

Что-то вдоль линий:

Model.all.each{|x| x.duration.slice!(" weeks")}.where("duration IS NOT NULL") 

Так что такие ценности, как "47 недель" просто стать "47", но это не метод Slice для ActiveRecord/ActiveModel и я не знаю эквивалента.

Любые идеи?

Заранее спасибо ...

ответ

1

Вы можете использовать where("column_name LIKE <matcher>") синтаксис для поиска моделей с колонки, имеющие найденную подстроку:

matching_models = Model.where("duration LIKE '% weeks'") 

Тогда итерацию на результат, используя gsub заменить колонку значение

matching_models.find_each do |model| 
    model.update_column(:duration, model.duration.gsub(/ weeks$/, "") 
end 

Некоторые важные моменты:

  • Используйте find_each вместо each, поскольку он будет загружать данные партиями, чтобы лучше использовать память.

  • gsub предназначен для замены существующей строки. Повторное выражение / weeks$/ соответствует строкам, заканчивающимся на «недели».

  • model.update_column используется вместо update_attributes для обхода ActiveRecord валидаций и обратных вызовов. Вы можете использовать update_attributes, если хотите выполнить проверки и обратные вызовы.

+0

Это сработало отлично, спасибо! – jake

0

Вы также можете использовать column_name.to_i получить из строки 47 недель

2

Принятого ответ работает правильно, но получите заметно медленно, если у вас есть несколько тысяч записей, оканчивающихся на «неделю» или больше, потому что Rails должен захватить и создать экземпляр всех совпадающих записей из таблицы.

В общем, предпочтительно, чтобы оставить всю работу на двигатель базы данных, если это возможно, что может быть записано так:

Model.where("duration LIKE '% weeks'"). 
     update_all("duration = SUBSTRING(duration, 1, LENGTH(duration) - 6)") 
# => UPDATE `models` SET `models`.`duration` = SUBSTRING(duration, 1, LENGTH(duration) - 6) WHERE (duration LIKE '% weeks') 

Этот запрос будет гораздо более производительным и память эффективно, если вам есть много записей для обновления. Он использует update_all Rails method для запуска запроса UPDATE во всех совпадающих записях в таблице и SUBSTRING function, чтобы сократить поле duration на 6 символов, что является длиной строки «недели».

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

  • Нет связанных вопросов^_^