2012-04-20 1 views
4

В моем приложении Rails я использую Sunspot для индексирования нескольких разных моделей. Затем у меня есть глобальная форма поиска, которая возвращает смешанные результаты. Это нормально работает:Rails + Sunspot: поиск нескольких моделей, но только определенные поля на одной из моделей?

Sunspot.search(Person, EmailAddress, PhoneNumber, PhysicalAddress) do 
    fulltext params[:q] 
    paginate :per_page => 10 
end 

Я хотел бы добавить дополнительную модель, скажем, проект в этот поиск. Модель проекта имеет совсем немного, индексируемые:

class Project < ActiveRecord::Base 
    searchable do 
    string :category do 
     category.name.downcase if category = self.category 
    end 

    string :client do 
     client.name.downcase if client = self.client 
    end 

    string :status 

    text :tracking_number 
    text :description 

    integer :category_id, :references => Category 
    integer :client_id, :references => Client 
    integer :tag_ids, :multiple => true, :references => Tag 

    time :created_at, :trie => true 
    time :updated_at, :trie => true 
    time :received_at, :trie => true 
    time :completed_at, :trie => true 
    end 
end 

Как я могу изменить мой оригинальный Sunspot.search вызов, чтобы добавить поиск записей проекта по просто tracking_number полю и неdescription поля?

ответ

0

Я думаю, вы должны определить свой номер_слеживания как текстовое поле, а не поле строки. Полнотекстовый поиск только по «текстовым полям».

ли вы попробовать это:

text:tracking_number 

И ваш поиск пятно выглядит следующим образом:

Sunspot.search(Person, EmailAddress, PhoneNumber, PhysicalAddress, Project) do 
    fulltext params[:q] 
    paginate :per_page => 10 
end 

Увидимся

+0

Спасибо за ответ. Да, я должен, вероятно, использовать метод «text». Тем не менее, я имел в виду вопрос сосредоточиться на том, как ограничить мой поиск только одним полем данной модели при выполнении поиска по нескольким образцам. Я уточню вопрос, чтобы быть более точным. – robertwbradford

+0

Я сделал другой ответ/решение – Sebastien

+0

, но как отобразить его в поле зрения? – brabertaser19

0

Пробовали ли вы что-то вроде:

Sunspot.search(Post) do 
    keywords 'great pizza', :fields => [:title, :body] 
end 

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

+0

Еще раз спасибо за ответ. Я полагаю, что это может сработать, но, похоже, это сломает любую разбивку на страницы и сортировку и т. Д. Всех результатов. Есть ли способ обойти это? – robertwbradford

+0

Используя will_paginate, вы можете сделать разбиение на страницы вашего объединенного массива. Я думаю, что это не проблема. – Sebastien

+2

также ломает базирующийся на основе автоматический заказ – Kevin

4
Sunspot.search(Person, EmailAddress, PhoneNumber, PhysicalAddress, Project) do 
    fulltext params[:q] do 
    fields(:tracking_number, :other_fields_outside_your_project_model) 
    end 

    paginate :per_page => 10 
end 

Это будет делать полнотекстовый поиск на TRACKING_NUMBER поле и любых других областях, которые Вы определяете, в частности, в вашем лице, EmailAddress, PhoneNumber и модели PhysicalAddress.

+0

, но как отобразить его в поле зрения? – brabertaser19

+0

Поиск будет возвращать список подходящих записей, возможно, разных типов. Вы можете отобразить атрибут или возвращаемое значение метода в записи после вызова response_to? по атрибуту/методу записи. – konyak

+0

Возможно, вы могли бы дать код этого? – brabertaser19