怎么做一个过滤器,然后找到祖先的后代?

时间:2013-12-12 17:24:00

标签: ruby-on-rails ruby-on-rails-3 ransack ancestry

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>

我也试过here

的@Rahul回答

没有Ancestry的后代,就像这样工作

@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 个答案:

答案 0 :(得分: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]