2016-08-17 1 views
0

Просто интересно, что лучший способ приблизиться к этому было бы,Rails: эффективный способ нахождения/замена слова в большой коллекции записей с использованием хэш-фильтра

У меня есть большой американец британский английский фильтр с около 2000 пункты

filter = {"authorized"=>"authorised"........} 

и большая коллекция около 4000 записей

posts = Post.all 

, что будет наиболее эффективным способом, чтобы сделать поиск и заменить через пару пр (например, post.title и post.description) для каждой записи при сохранении оригинальной обсадной колонны (т.е. заменить все символы после первого)?

редактировать: обновленный подсчет хэша

ответ

1

Я бы подумать об использовании gsub с Regexp.union и хэш-синтаксисом:

string.gsub(Regexp.union(filter.keys), filter) 

перебрать все сообщения использовать find_each для улучшения использования памяти:

FILTER = { "authorized" => "authorised", ... } 
FILTER_REGEXP = Regexp.new(Regexp.union(FILTER.keys), Regexp::IGNORECASE) 

def translate(string) 
    string.gsub(FILTER_REGEXP, FILTER) 
end 

Post.find_each do |post| 
    post.update(
    title:  translate(post.title), 
    description: translate(post.description) 
) 
end 

Чтобы поддерживать исходный корпус, я бы добавил обе версии к хэшу (верхний и нижний регистр), что делает все это gexp больше, но делает код более удобным для чтения, и вы избегаете дополнительной логики для обработки разных случаев. Чтобы генерировать хэш с обеими версиями от вашего текущего хеша, просто используйте:

filter = Hash[*filter.map { |k, v| [[k,v], [k.capitalize,v.capitalize]] }.flatten] 
Смежные вопросы