Использование предложения where для поиска потомков - Rails 3.0 и Ancestry - PullRequest
0 голосов
/ 04 февраля 2012

Как найти записи в таблице, которые являются потомками другой записи, с помощью предложения where (чтобы получить эти записи только из базы данных)?

Допустим, у меня есть дерево с локациями. Корневые местоположения - это страны, местоположения на следующем уровне - государства, а их дочерние узлы - города. Как я могу, используя предложение where, найти только города в определенном штате?

Я планировал проверить, включают ли строки предков городов строку родословной штата, но я не мог понять, как это сделать.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Предполагая, что у вас есть таблица под названием '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 таблицы для стран, штатов и городов. Тогда вы можете использовать только простые ассоциации.

0 голосов
/ 04 февраля 2012

Используйте области, сгенерированные Ancestry , например children_of(node), где вы можете указать идентификатор состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...