Rails 3.2 を使用しています。適切な再帰ループの書き方を理解したいです。関連付けとコントローラーは次のとおりです。
# country.rb
class Country < ActiveRecord::Base
has_many :states
end
# state.rb
class State < ActiveRecord::Base
belongs_to :country
has_many :zones
has_many :cities, :through => :zones
end
# zone.rb
class Zone < ActiveRecord::Base
belongs_to :state
belongs_to :city
end
# city.rb
class City < ActiveRecord::Base
has_many :photos, :as => :attachable
end
# photo.rb
class Photo < ActiveRecord::Base
belongs_to :attachable, :polymorphic => true
has_attached_file :data, :options
end
# countries_controller.rb
class CountriesController < ApplicationController
def show
@country = Country.find(params[:id], :includes => [:states => [:cities => :photos]])
@photos = @country.country_photos
end
end
私が達成しようとしていることを説明するために、以下にばかげた再帰ループを書きます: 都市から写真を取得します:
# countries/show.html.erb
<%= @country.country_photos.inspect # just to test %>
# country.rb
class Country < ActiveRecord::Base
def country_photos
all_photos = []
self.states.each do |state|
state.cities.each do |city|
city.photos.each do |photo|
all_photos << photo
end
end
end
end
end
# Expected output: [photo_object_1, photo_object_2]
私はで使用map
してみましたcountry_photos
:
if (photos = state.map(&:cities).flatten.map(&:photos).flatten)
photos
end
ただし、パフォーマンスに問題があります。実行に 400 ミリ秒かかります。
再帰ループを書く適切な方法は何ですか? ステップバイステップの説明があれば感謝します。ありがとう。