Происхождение рельсов: Получите дочерние записи модели предков

У меня есть две модели:

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

Все посты извлекаются в одном запросе (благодаря включениям), затем вы перебираете подкатегории и посты.

Другие вопросы по тегам