2

我有一组使用belongs_to关联的类别和子类别中的帖子。此外,这些帖子belongs_to与我的州和城市模型有关。

request.subdomain我通过对 URL 中的子域进行检查,将控制器上的帖子显示限制为属于相应位置(即城市或州)的帖子。这对除了使用 Tire/ElasticSearch 进行搜索之外的所有内容都非常有效。

出于某种原因,我无法让轮胎将搜索结果限制为属于特定位置的帖子。我尝试使用模型中的 a 将子域放入模型中,并在控制器中cater_accessor :request_subdomain添加一个与子域关联的位置。before_filter@city_or_state

 def set_request_subdomain
   Post.request_subdomain = @city_or_state if !@city_or_state.nil?
 end

这是我的模型:

  def self.search(params)
tire.search(load: true, page: params[:page], per_page: 10) do
  query { string params[:query], default_operator: "AND" } if params[:query].present?
  filter :terms, :published => [true]
  filter :terms, :request_subdomain => [:city_subdomain || :state_subdomain] 
end
end

def to_indexed_json
  to_json(methods: [:city_name, :city_subdomain, :state_name, :state_subdomain])
end

def city_name
  self.city.name
end

def city_subdomain
  city.subdomain.titleize
end

def state_name
  self.state.name
end

def state_subdomain
  state.subdomain.titleize
end

我需要搜索来限制位置(即子域)的结果。

我在这里想念什么?

更新: 我已经关注了这个railscast 并且能够让 Facets 工作......我在想也许我可以限制基于 Facet 搜索的项目(即没有用户在 railscast 中选择 Facet),但我没有无法让它发挥作用。

有任何想法吗?

4

2 回答 2

1

这个

filter :terms, :request_subdomain => [:city_subdomain || :state_subdomain] 

是从后到前 - hashrocket 的左侧应该是您的轮胎指数的属性,而右侧的值应该匹配。其次,这只是普通的红宝石,所以

[:city_subdomain || :state_subdomain] 

计算结果为 just :city_subdomain,“或”不会神奇地进入查询逻辑

相反,您想说:city_subdomain匹配某个值或state_subdomain匹配。你可以用这样的东西来做到这一点,假设这subdomain是一个局部变量或你的搜索方法的参数(远比一个类级别的变量好)

filter :or, [
               {:term => {:city_subdomain => subdomain}},
               {:term => {:state_subdomain => subdomain}}
            ] 
于 2013-05-31T21:26:53.310 回答
0

如果您正在寻找限制结果的数量,您可以随时在搜索块内运行一些 ruby​​,并使用sizeandfrom方法。

search = Tire.search(Location.index_name) do |s|
    s.query do |q|
        q.string "las vegas"
    end
    # Best used for pagination
    s.size 25 # limit 25 results
    s.from 0 # start at the beginning.
end

我不确定你到底需要什么,但你总是可以做类似的事情

if something.nil?
    s.size 0
else
    s.size 25
end

那将根据某些条件更改限制。

于 2013-05-31T21:05:17.547 回答