2013-12-12 44 views
0

reading this(在@thomasfedb答案),我以爲這會工作:如何做一個過濾器,然後找到Ancestry後裔?

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

我也試着從here

@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也會出現錯誤。出於這個原因,我沒有把它列入標題。如果沒有洗劫,這將是這樣的:

@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

我剛剛更新了我的答案,以更好的方式獲得相關ID。我提供的原始解決方案將觸發N + 1查詢,這將越來越低效,您選擇的類別越多。我也走過了提取這些ID的方式。 –

回答

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]