2016-08-17 1 views
0

を使用してレコードの大規模なコレクション内の単語を置き換える/発見の効率的な方法、のRails:ちょうどこのアプローチする最良の方法がどうなるか疑問に思ったハッシュフィルタ

私は約2000とイギリス英語フィルタに大きなアメリカを持っていますアイテムの検索を行うと、PRのカップルの間で交換する最も効率的な方法であるもの

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

約4000の記録

posts = Post.all 

の大規模なコレクションオリジナルのケーシングを維持しながら各レコードのオペレーション(例えば、post.titlepost.description)最初の文字の後ろのすべての文字を置き換えます)?

編集:更新されたハッシュ回数

答えて

1

私はRegexp.unionとハッシュ構文でgsubの使用について思うだろう:

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] 
関連する問題