Происхождение рельсов: Получите дочерние записи модели предков
У меня есть две модели:
Post
- category_id
Category (ancestry model)
Дерево категорий выглядит, например, так:
- Root Category
- Sub Category
Теперь допустим, что сообщение классифицируется как подкатегория. Я нахожусь в корневой категории, и я хотел бы видеть все сообщения, которые также находятся в подкатегории. Возможно ли получить их также с родословной?
Дерево категорий всегда имеет только один вложенный уровень, так что, возможно, родословная в любом случае слишком велика.
заранее спасибо
Рабочий пример только для одного вложенного уровня
@category = Category.find(params[:id])
category_ids = @category.children.map(&:id) << @category.id
category_ids = category_ids.join(",")
@posts = Post.recent.where("category_id IN (#{category_ids})").page(params[:page])
2 ответа
Я полагаю, что следующее поможет.
Post.where(category_id: @category.subtree_ids)
А также, вероятно, будет наиболее эффективным способом, не делая что-то действительно ужасное.
Что-то вроде
Post.where('subcategory_id in ('+@category.subcategories.select(&:id).join(',')+')')
Затем вы запрашиваете сообщения, у которых есть их идентификатор категории в списке, сгенерированном @category.sucategories, из которого вы выбираете идентификатор и объединяете их в строку типа "1,5,77".
Что-то очень-очень плохое сделать (просто для удовольствия):
@mylist = Array.new
Post.all.each do |item|
@mylist << item if item.subcategory.category = @selectedrootcategory
Обновление: Просто подумал о каком-то другом решении:
@allposts = Array.new
@selectedrootcategory.includes(:subcategory => :posts).subcategories.each do |subcat|
@allposts << subcat.posts
Все посты извлекаются в одном запросе (благодаря включениям), затем вы перебираете подкатегории и посты.