Проблемы с реализацией поиска солнечных пятен через ассоциации

У меня возникли проблемы с внедрением Sunspot! В течение последних 2 дней я пытался заставить это работать, и я не могу найти никакого решения (хотя, без сомнения, он смотрел мне в лицо!).

Я хочу, чтобы пользователь мог искать производителя автомобилей. Когда автомобиль создается, ему через ассоциацию назначается производитель (как вы можете видеть ниже). Теперь .. как мне разрешить пользователю вводить в поле поиска (или даже лучше 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

person Martin    schedule 04.06.2014    source источник


Ответы (1)


Проблема в том, как вы выполняете поиск в своем контроллере. Вы сказали, что в идеальном мире вы хотели бы выбирать производителей из одного элемента:

<%= 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 %>

Если вы определите форму поиска таким образом, у вас будет параметр manufacturer в URL-адресе после отправки формы.

Вы хотите отфильтровать автомобили по идентификатору производителя в вашем контроллере, поэтому вы не можете выполнять полнотекстовый поиск, вы должны использовать 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

person dtengeri    schedule 06.06.2014