2014-05-15 5 views
0

У меня есть модели Book and Author, и я хотел бы сделать строки загрузки таблицы авторов, используя метод в то же время, я использую elasticsearch (шина) , Позвольте мне показать код.Включите другую таблицу в поиск Elasticsearch on Rails (gem Tire)

Вот мой контроллер:

def index 
    @books = Book.search(params) 
    end 

и моя модель:

class Book < ActiveRecord::Base 
    has_and_belongs_to_many :authors 

    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    mapping do 
    indexes :id 
    indexes :title, analyzer: 'snowball' 
    indexes :summary, analyzer: 'snowball' 
    indexes :released_at, type: 'date' 
    indexes :edition 
    indexes :isbn, analyzer: 'keyword' 
    indexes :authors_name 
    indexes :author do 
     indexes :id 
     indexes :name 
    end 

    end 

    def self.search(params) 
    tire.search(load: true) do 
     query { string params[:query] } if params[:query].present? 
    end 
    end 

    def authors_name 
    authors.all 
    end 

    # Needed to be searchable 
    def to_indexed_json 
    to_json(include: { authors: { only: [:name] } }) 
    end 

end 

Это вид и рельсы войти:

<%= book.authors_name.map {|a| link_to a.name, author_path(a.id) }.join(', ').html_safe %> 


tarted GET "/books?utf8=%E2%9C%93&query=&commit=Search" for 127.0.0.1 at 2014-05-15 17:38:58 -0300 
Processing by BooksController#index as HTML 
    Parameters: {"utf8"=>"✓", "query"=>"", "commit"=>"Search"} 
    Book Load (0.2ms) SELECT "books".* FROM "books" WHERE "books"."id" IN (2, 1) 
    Author Load (0.2ms) SELECT "authors".* FROM "authors" INNER JOIN "authors_books" ON "authors"."id" = "authors_books"."author_id" WHERE "authors_books"."book_id" = ? [["book_id", 2]] 
    Author Load (0.1ms) SELECT "authors".* FROM "authors" INNER JOIN "authors_books" ON "authors"."id" = "authors_books"."author_id" WHERE "authors_books"."book_id" = ? [["book_id", 1]] 
    Rendered books/index.html.erb within layouts/application (11.2ms) 
Completed 200 OK in 69ms (Views: 62.7ms | ActiveRecord: 0.5ms) 

Но до сих пор мне не удалось с ним , Есть ли способ, которым я могу это сделать?

+0

Я нахожу это на модуле поиска шин: 'Article.search: load => {: include =>' comments '} do ... end'. Но я все еще пытаюсь это сделать. https://github.com/karmi/retire/blob/master/lib/tire/model/search.rb –

ответ

1

Я сделал это!

Как я уже загружен индексы авторов:

indexes :author do 
    indexes :id 
    indexes :name 
end 

мне просто нужно, чтобы убедиться, что идентификатор и имя были отправлены через JSON:

def to_indexed_json 
    to_json include: :authors 
end 

Тогда я могу сделать это с точки зрения:

<span>By <%= book.authors.map { |a| link_to a.name, author_path(a.id) }.join(', ').html_safe %></span> 

И я удалил нагрузку: true из кода, который делает загрузку страницы намного быстрее.