Настройте поиск Sunspot Solr с областью действия

Контроллер

class GearsController < ApplicationController
  before_action :set_gear, only: [:show, :edit, :update, :destroy]

  def primary
    @gears = Gear.search do
      with(:Lab, 'Primary')
      order_by(:RU, :desc)
    end
  end

Модель

class Gear < ActiveRecord::Base
  validates_uniqueness_of :Nic1mac, :Nic2mac, :Nic3mac, :IBmac, :SN, :allow_blank => true
  attr_readonly :Devtype, :Nic1mac, :Nic2mac, :Nic3mac, :IBmac, :SN

  scope :Mini, -> { where(lab: 'Mini') }
  scope :Primary, -> { where(lab: 'Primary') }
  scope :Support, -> { where(lab: 'Support') }
  scope :M5, -> { where(lab: 'M5') }
  scope :P5, -> { where(lab: 'P5') }

  searchable do
    integer :RU
    text :Devname
    text :Devtype
    string :Lab
    text :Swportib
    text :Swport1
    text :Swport2
    text :Swport3
    text :IBip
    text :Nic1
    text :Nic2
    text :Nic3
    text :Nic1mac
    text :Nic2mac
    text :Nic3mac
    text :IBmac
    text :Psu1
    text :Psu2
    text :SN
 end
end

Просмотреть

<% provide(:title, "SP4 Primary") %>
<p id="notice"><%= notice %></p>

<h1>SP4 Primary</h1>

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

<head>
<style>
table, th, td { border: 1px solid black;}
th, td { padding: 15px;}
</style>
</head>

<table>
  <thead>
   <tr>
      <th>RU</th>
      <th>Dev Name</th>
      <th>Dev Type</th>
      <th>Lab</th>
      <th>SW PortIB</th>
      <th>SW Port1</th>
      <th>SW Port2</th>
      <th>SW Port3</th>
      <th>IB IP</th>
      <th>NIC1</th>
      <th>NIC2</th>
      <th>NIC3</th>
      <th>NIC1 Mac</th>
      <th>NIC2 Mac</th>
      <th>NIC3 Mac</th>
      <th>IB Mac</th>
      <th>PSU1</th>
      <th>PSU2</th>
      <th>SN</th>
      <th colspan="3"></th>
    </tr>
  </thead>
<tbody>
    <% @gears.each do |gear| %>
      <tr>
        <td><%= gear.RU %></td>
        <td><%= gear.Devname %></td>
        <td><%= gear.Devtype %></td>
        <td><%= gear.Lab %></td>
        <td><%= gear.Swportib %></td>
        <td><%= gear.Swport1 %></td>
        <td><%= gear.Swport2 %></td>
        <td><%= gear.Swport3 %></td>
        <td><%= gear.IBip %></td>
        <td><%= gear.Nic1 %></td>
        <td><%= gear.Nic2 %></td>
        <td><%= gear.Nic3 %></td>
        <td><%= gear.Nic1mac %></td>
        <td><%= gear.Nic2mac %></td>
        <td><%= gear.Nic3mac %></td>
        <td><%= gear.IBmac %></td>
        <td><%= gear.Psu1 %></td>
        <td><%= gear.Psu2 %></td>
        <td><%= gear.SN %></td>
        <td><%= link_to 'Show', gear %></td>
        <td><%= link_to 'Edit', edit_gear_path(gear) %></td>
        <td><%= link_to 'Destroy', gear, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

Выше мой код контроллера и модели. Я пытаюсь настроить поиск, чтобы он выполнял поиск только по записям в указанной области. В настоящее время он возвращает все результаты и не обращает внимания на область действия. Я считаю, что я близок к тому, чтобы заставить его работать, но у меня просто нет правильного синтаксиса. Опять же, я могу ошибаться, поэтому приветствуются любые предложения помощи или другие способы сделать это.


person aealvarez3    schedule 20.04.2015    source источник


Ответы (2)


Вы можете добавить такой код в свой метод поиска

with(:lab, 'Support')

и в вашей модели добавьте это

string :lab
person rocki    schedule 20.04.2015
comment
Я попробовал ваше предложение @rocki, но все равно не повезло. Я продолжаю получать все результаты, а не только те, которые входят в объем. - person aealvarez3; 20.04.2015
comment
вы должны убить свой сервер и запустить rake sunspot:solr:reindex - person rocki; 20.04.2015
comment
@aealvarez3, пожалуйста, примите ответ, если он вам помог - person rocki; 20.04.2015
comment
я убил свой сервер и запускал rake sunspot:solr:reindex несколько раз, и все равно не повезло. - person aealvarez3; 20.04.2015
comment
Вы изменили свою лабораторию на строку в своей модели вместо использования текста - person rocki; 20.04.2015
comment
да, в моей модели я изменил текст :Lab на строку :Lab под моей функцией поиска. - person aealvarez3; 20.04.2015

Решение заключалось в добавлении without в мой файл gears_controller.rb.

gears_controller.rb

 def rack1
    @gears = Gear.where("Lab like ? OR Lab like ? OR Lab like ?", "%Primary%", "%Mini%", "%Support%")
    @search = Gear.search do
      fulltext params[:search]
      without(:Lab, "P5")
      without(:Lab, "M5")
      order_by(:RU, :desc)
  end
    @gears = @search.results
  end

Добавление полей без полей позволило мне выполнять поиск только по записям с конкретными значениями Lab, которые были указаны в моей переменной @gears.

person aealvarez3    schedule 26.05.2015