如何同时使用will_paginate和过滤器与Tire(弹性搜索)

时间:2014-02-09 19:30:54

标签: ruby-on-rails elasticsearch tire

看起来我可以使用其中一个而不是两个,任何人都有一个如何做到这一点的例子?问题是,为了使用will_paginate,我必须在模型中使用搜索方法

Item.search("test", :page => 1, :per_page => 20)

但是为了使用过滤器,我必须直接使用Tire:

search = Tire::Search::Search.new("items")
search.filter :term, :selected => true

但我无法找到如何做到这两点。谢谢你的任何建议。

1 个答案:

答案 0 :(得分:0)

我还没有使用这个库,但据我所知,源代码中,Model#search和Tire :: Search :: Search应该采用相同的选项。如果您查看Model#search的源代码,它会执行此操作(缩减为相关部分):

def search(*args, &block)

  query, options = args

  s = Tire::Search::Search.new(options.delete(:index), options)

所以选项只是传递给Tire :: Search :: Search的初始化器。

但这只是创造了对象。 Tire :: Search :: Search似乎在内部使用术语sizefrom而不是per_pagepage。所以上面的代码继续这样:

  page     = options.delete(:page)
  per_page = options.delete(:per_page) || Tire::Results::Pagination::default_per_page

  s.size( per_page.to_i ) if per_page
  s.from( page.to_i <= 1 ? 0 : (per_page.to_i * (page.to_i-1)) ) if page && per_page

所以似乎frompage的工作方式不同(sizeper_page相似)。 from是一个绝对的立场。 (我不知道究竟是什么Tire :: Results :: Pagination :: default_per_page在这里添加,也许可以设置一些默认值。)

总而言之,我的有根据的猜测是,这样的事情对你有用:

search = Tire::Search::Search.new("items", size: 20, from: 0)

您要计算的其他页面位置(per_page *(第1页))