Как сделать фильтр, а затем найти потомков Ancestry?
Прочитав это (ответ @thomasfedb), я подумал, что это сработает:
@categories = Category.joins(:category_users).where("category_users.user_id = ? AND category_users.interested_learning IS TRUE", current_user.id)
@search = Resource.joins(:categories).where(category_id: @categories.subtree_ids).search_filter(params[:search_filter]).paginate(:per_page => 20, :page => params[:page]).search(params[:q])
Но вместо этого я получаю эту ошибку
undefined method `subtree_ids' for #<ActiveRecord::Relation:0x007fce832b1070>
Я также попробовал ответ @Rahul отсюда
Без потомков, это работает так
@search = Resource.joins(:category_users).where("category_users.user_id = ? AND category_users.interested_learning IS TRUE", current_user.id).search_filter(params[:search_filter]).paginate(:per_page => 20, :page => params[:page]).search(params[:q])
Несмотря на то, что я хочу выполнить поиск Ransack после обнаружения потомков, ошибка также появляется без Ransack. По этой причине я не включил его в заголовок. Без Ransack это было бы так:
@categories = Category.joins(:category_users).where("category_users.user_id = ? AND category_users.interested_learning IS TRUE", current_user.id)
@resources = Resource.joins(:categories).where(category_id: @categories.subtree_ids)
Буду признателен за любые советы по этому вопросу может работать
1 ответ
@categories.subtree_ids
не будет работать, потому что subtree_ids
является методом экземпляра, тогда как вы вызываете ActiveRecord::Relation
, Попробуйте это вместо этого:
@categories.map(&:subtree_ids).flatten.uniq
Это может быть не особенно производительным, но предки хранят и анализируют столбец, аналогичный "10/1/3", для управления иерархией. Вышеуказанное, скорее всего, вызовет запрос N+1. Другим вариантом было бы проанализировать столбцы самостоятельно. Я не уверен, что родословная предоставляет лучший способ сделать это, но это довольно просто:
arr = @categories.pluck(:ancestry)
#> ["10/1", "5/6/1", "2", nil, nil]
arr.compact
#> ["10/1", "5/6/1", "2"]
arr.map { |ids| ids.split('/') }
#> [["10","1"],["5","6","1"],["2"]]
arr.flatten
#> ["10","1","5","6","1","2"]
arr.uniq
#> ["10","1","5","6","2"]
arr.map(&:to_i)
#> [10,1,5,6,2]
Сложите все это вместе (я бы предложил многострочный метод):
@categories.pluck(:ancestry).compact.map { |ids| ids.split('/') }.flatten.uniq.map(&:to_i)
#> [10,1,5,6,2]