2013-12-12 3 views
0

После reading this (@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 ответ от here

Без потомков потомков он работает следующим образом

@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. По этой причине я не включил его в заголовок. Без рыскать, это было бы так:

@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) 

Я был бы признателен за любые советы по этому вопросу может работать

+0

Я только что обновил свой ответ, чтобы получить соответствующие идентификаторы. Исходное решение, которое я предоставил, вызовет запрос N + 1, который станет все более неэффективным, чем больше категорий, которые вы выберете. Я также прошел путь, чтобы извлечь эти идентификаторы. –

ответ

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] 

 Смежные вопросы

  • Нет связанных вопросов^_^