2013-01-01 2 views
0

내 프로젝트에서 cedict 오픈 소스 중국어 영어 사전을 사용하고 있습니다. 다른 모델과 관계가없는 ActiveRecord 모델링 된 postgresql 데이터베이스에 넣었습니다.ActiveRecord에서 두 개의 사전 항목을 병합하려면 어떻게해야합니까?

DictionaryEntry.count(:id, :group => :simplified, :having => 'count(id) > 1')을 실행하면 2141 개의 중복 항목이 표시됩니다. 단순화 된 문자는이 항목에서 동일하지만 정의가 다릅니다. 예를 들어

, 두 개의 항목이 放之四海而皆准 거기에있는 것을 알 수 있지만, 두 개의 서로 다른 정의를 가지고

irb(main):009:0> DictionaryEntry.find_all_by_simplified("放之四海而皆准") 
    DictionaryEntry Load (193.6ms) SELECT "dictionary_entries".* FROM "dictionary_entries" WHERE "dictionary_entries"."simplified" = '放之四海而皆准' 
[ 
    [0] #<DictionaryEntry:0x007feb8750f9e0> { 
       :id => 42164, 
     :traditional => "放之四海而皆准", 
     :simplified => "放之四海而皆准", 
      :pinyin => "fang4 zhi1 si4 hai3 er2 jie1 zhun3", 
     :definition => "appropriate to any place and any time -idiom; universally applicable/a panacea", 
     :created_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00, 
     :updated_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00 
    }, 
    [1] #<DictionaryEntry:0x007feb8750f378> { 
       :id => 42165, 
     :traditional => "放之四海而皆準", 
     :simplified => "放之四海而皆准", 
      :pinyin => "fang4 zhi1 si4 hai3 er2 jie1 zhun3", 
     :definition => "applicable anywhere -idiom", 
     :created_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00, 
     :updated_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00 
    } 
] 

내가 DictionaryEntry.find_all_by_simplified("放之四海而皆准")을 실행할 때와 객체를 반환하도록이 두 항목을 병합하고 싶습니다 삭제 된 개체의 정의는 /과 같이 후 마지막에 추가 :

[ 
    [0] #<DictionaryEntry:0x007feb8750f9e0> { 
       :id => 42164, 
     :traditional => "放之四海而皆准", 
     :simplified => "放之四海而皆准", 
      :pinyin => "fang4 zhi1 si4 hai3 er2 jie1 zhun3", 
     :definition => "appropriate to any place and any time -idiom; universally applicable/a panacea/applicable anywhere -idiom", 
     :created_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00, 
     :updated_at => Sat, 22 Dec 2012 03:07:44 UTC +00:00 
    } 
] 

(나는 또한 그래 ... 흠 ... 아직 다른,하지 않도록하기 위해 발생하는 경우 병음을 병합 할 수 있습니다 I 엠 . ight 그렇게해야 할)

답변

0

레일 콘솔에서 다음 명령을 입력하면 날 위해 일하는 것 같았다 :

dups = DictionaryEntry.count(:id, :group => :simplified, :having => 'count(id) > 1') 
dups.each do |d| 
twins = DictionaryEntry.find_all_by_simplified(d[0]) 
if twins[0].pinyin == twins[1].pinyin 
twins[1].definition = twins[1].definition + "/" + twins[0].definition 
twins[1].save 
twins[0].destroy 
end 
end 

내가 몇 번을 실행했다.

관련 문제