複数のテーブルからすべての情報を 1 つに蓄積する rake タスクがあります。各テーブルは約 200,000 行です。
task :migrate_all_info_tables_to_one => :environment do
profiles = Profile.all
profiles.each do |profile|
basic_info_items = profile.basic_info_items
basic_info_items.each do |item|
info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'info', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
profile.info_items << info
end
cities = profile.cities
cities.each do |city|
city = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'city', :value => city.title, :link => city.link != 'none' ? city.link : nil, :description => city.description)
profile.info_items << city
end
histories = profile.histories
histories.each do |item|
info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'history', :value => item.year, :link => item.link != 'none' ? item.link : nil, :description => item.event)
profile.info_items << info
end
contacts = profile.contacts
contacts.each do |item|
info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'contact', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
profile.info_items << info
end
end
end
必要なすべてのインデックスをテーブルに追加しました (mysql 5.1.6 を使用)。mysql からの各個別のクエリは、ruby コンソールからも 0.00 秒かかります。しかし、この rake タスクを実行すると、1 分間に 100 個のプロファイル レコードしか処理されません。
PS: プロジェクトのデータベース アーキテクチャを間違えたので、これを行います。