Предполагая, что у вас есть таблица под названием 'location', вы можете создать 3 разные модели, используя эту таблицу местоположений:
class Country < ActiveRecord::Base
set_table_name 'locations'
has_many :states, :class_name => 'State', foreign_key => "parent_id"
end
class State < ActiveRecord::Base
set_table_name 'locations'
has_many :cities, :class_name => 'City', foreign_key => "parent_id"
belongs_to :parent, :class_name => "Country"
end
class City < ActiveRecord::Base
set_table_name 'locations'
belongs_to :parent, :class_name => "State"
end
Теперь вы можете использовать что-то вроде
countries = Country.find(:all, :conditions => {:parent_id => nil } )
, поскольку страны являются «корневыми элементами», поэтому у них нет родителя.
Для каждой страны вы можете найти штаты похожим образом, скажем, «США» имеет идентификатор 1, его штаты можно найти по:
states = State.find(:all, :conditions => {:parent_id => 1 } )
или если вы уже поместили usa в переменную только этим
usa.states
См. Руководство Ассоциации Rails для получения дополнительной информации о :class_name
, :foreign_key
и других has_many
опциях, использованных в примере.
Примечание : Надеюсь, я не допустил (слишком много) ошибок, но я сделал нечто подобное с меню, подменю и их элементами.
Примечание2 : Конечно, было бы намного проще, если бы вы использовали 3 таблицы для стран, штатов и городов. Тогда вы можете использовать только простые ассоциации.