通过关联实现Sunspot搜索的问题

时间:2014-06-04 21:02:42

标签: ruby-on-rails sunspot sunspot-rails sunspot-solr

我在实施Sunspot时遇到了一些问题!我在过去的两天里一直试着让这个工作起来,我似乎无法找到任何解决方案(尽管毫无疑问它一直盯着我看!)。

我希望用户能够搜索车辆制造商。创建车辆时,会通过关联为其分配制造商(如下所示)。现在..我如何允许用户输入搜索字段(或者更好的是所有制造商的collection_select)并且它会过滤掉结果?

在一个理想的世界里,我喜欢这个作为我的搜索:

<%= simple_form_for :search,  url: vehicles_path , :method => :get do |f| %>
    <%= select_tag :manufacturer, options_from_collection_for_select(Manufacturer.all, :id, :name) %> 
    <%= submit_tag "Search", :name => nil %>
<% end %>

但是,唉,我还没能在我的车型中找到解决方案。

如果这对你有意义,我希望你能引导我朝着正确的方向前进!

非常感谢!

class Vehicle < ActiveRecord::Base

    belongs_to :manufacturer

    searchable do
        text    :name, :registration
        integer :manufacturer_id
    end

    def to_s
        self.name
    end
end

然后

class VehiclesController < ApplicationController
  before_action :set_vehicle, only: [:show, :edit, :update, :destroy]

  def index
    @manufacturer = Manufacturer.all

    @search = Vehicle.search do
      fulltext params[:search]
    end

    @vehicles = @search.results
  end
end

class Manufacturer < ActiveRecord::Base
    has_many :vehicles

    searchable do
        text    :name
    end

    def to_s
        self.name
    end

end

车辆index.html.erb

    <%= form_tag vehicles_path, :method => :get do %>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil %>
    <% end %>

我的车辆形式

<%= simple_nested_form_for @vehicle, :html=>{:multipart => true } do |f| %>

  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :name %>
    <%= f.association :manufacturer, include_blank: false %>
</div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>

 <% end %>

为了方便起见,我已删除了我的示例中的大部分不必要的内容。

只是为了一些笑声,你可以看看我失败的尝试!

我也经营过这么多耙太阳黑子:重新注入它的疯狂。

    #integer :manufacturer_id, :multiple => true

    #integer :manufacturer_id, :references => Manufacturer, :multiple => true

    #integer :manufacturer_id, :references => Manufacturer, :multiple => true do
    #   manufacturers.map {|manufacturer| manufacturer.manufacturer_name}
    #end

    #text :manufacturer_names do |manufacturer|
    #  manufacturer.name { |manufacturer| manufacturer.name }
    #end 

    #integer :manufacturer_id {|manufacturer| manufacturer.name }

    #string :manufacturer_name do
    #   manufacturer.name { |manufacturer| manufacturer.name }
    #end

    #text :manufacturers do
    #   manufacturers.map { |manufacturer| manufacturer.name }
    #end

    #integer :manufacturer_id, :stored => true

1 个答案:

答案 0 :(得分:4)

问题在于您在控制器中进行搜索的方式。 你说在理想世界中你想从选择元素中选择制造商:

<%= simple_form_for :search,  url: vehicles_path , :method => :get do |f| %>
<%= select_tag :manufacturer, options_from_collection_for_select(Manufacturer.all, :id, :name) %> 
<%= submit_tag "Search", :name => nil %>

如果您以这种方式定义搜索表单,则在提交表单后,URL中会有manufacturer参数。

您希望按控制器中制造商的ID过滤车辆,因此您无法进行full_text搜索,您必须在搜索块中使用with

class VehiclesController < ApplicationController
  def index
    @search = Vehicle.search do
      # Scope the query
      with :manufacturer_id, params[:manufacturer]
    end

    @vehicles = @search.results
  end
end

太阳黑子文件说:

  

未定义为文本的字段(例如,整数,布尔值,时间等等)可用于在执行全文匹配之前对查询进行范围(限制)。

您可以找到有关范围界定的更多信息:https://github.com/sunspot/sunspot#scoping-scalar-fields