2016-08-17 4 views
0

그냥 가장 좋은 방법은 레일 : 발견의 효율적인 방법/해시 필터를 사용하여 기록의 큰 컬렉션 단어를 대체는

내가 약 2000 영국 영어 필터로 큰 미국이,이 것 접근 궁금 항목

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

약 4000 기록

의 대규모 수집
posts = Post.all 

검색을하고 홍보의 부부를 통해 대체 할 수있는 가장 효율적인 방법이 될 것입니다 무슨 (즉, post.titlepost.description)를 유지하면서 원래의 케이스 (예 : 첫 번째 문자 다음에 오는 모든 문자를 바꿉니 까?)?

편집 : 업데이트 된 해시 수

답변

1
나는 Regexp.union 해시 구문을 gsub 사용에 대한 생각

:

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 
:

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

모든 게시물 메모리 사용을 개선하기 위해 find_each을 사용하여 반복하려면

원래 케이스를 지원하기 위해 해시 (대문자 및 소문자)에 두 버전을 추가하여 전체 버전을 다시 만듭니다. gexp는 더 크지 만 코드를 읽기 쉽도록 만들고 다른 케이스를 처리하기위한 추가 로직을 피할 수 있습니다. 현재 해시의 두 버전으로 해시를 생성하려면 다음을 사용하십시오.

filter = Hash[*filter.map { |k, v| [[k,v], [k.capitalize,v.capitalize]] }.flatten]