我在实施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
答案 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