Modeldeki verileri indexleyerek arama işlemini yapan bir gem. Burda cok basit olarak kullanımı ve arama işlemini yapacağız. Burdaki projede bulunan movie modelim üzerinden arama işlemini yaptıracağım.
gem:
gem 'elasticsearch-rails'
gem 'elasticsearch-model'
movie.rb
def as_indexed_json(options={})
self.as_json(only: [:name, :director])
end
=> eğer movie modelim başka bir modelle ilişkili olsaydı ve o alanlardada arama yapmak isteseydik bu kod şöyle olacaktı.
def as_indexed_json(options={})
self.as_json(only: [:name,:director],
include: { player: { only: [ name:],
include: { player_profile: { only: [:country] } }
}
})
end
Biraz saçma bi ilişki oldu ama örnek vermesi açısından..:)
movie modelimiz oyuncular modeline bağli oyuncularda kendi profillerine
bu modele göre arama yaptığımız kelimeyi, filmin adında, yapımcısında, oyuncularda ve oyuncuların sehirlerine bakarak arayacak ve herhengi bir alanla eşleşirse o veriye ait film bilgisini getirecek
biz sadece movie filminin adını ve yapımcısına bakarak arama yapmasını sağlayıp devam edelim
index.html sayfamıza arama yapmak için alan ekleyelim
<%=form_tag movies_path, method: :get , :role => 'form' do%>
<p>
<%=text_field_tag :q, params[:q],placeholder: 'Arama yapın...'%>
<%=submit_tag "Ara"%>
</p>
<%end%>
index sayfamız şu şekilde:
movie_controller.rb index methodumuza gelelim
def index
@movie = Movie.all
if params[:q].present?
@movies = @movie.search(query: { query_string: {query: "*#{params[:q]}*"}}).records
else
@movies = @movie
end
end
=> burda willpaginate kullanmadık. eğer verilerimiz will paginateli olsaydı bu kodlar şöyle olurdu
if params[:q].present?
@movies = @movie.search(query: { query_string: {query: "*#{params[:q]}*"}}).page(params[:page]).records
else
@movies = @movie.paginate(page: params[:page], per_page: 15).order(name: :asc)
end
=> eğer translate kullandıysak(globalize) @movie değişkenini şu şekilde oluşturmamız gerekirdi
@movie = Movie.includes(:translations)
Şimdi çalıştırıp bakalım
name alanında arama
yapımcı alanında arama