2016-06-08 10 views
0

Wie man einen Kategoriefilter für searchkick implementiert. Grundsätzlich habe ich ein Eingabefeld, das den Suchbegriff verwendet, aber ich möchte auch eine Dropdown-Liste, die Benutzer eine Kategorie auswählen können, um in ALLEN Kategorien zu suchen oder zu suchen. Es gibt eine viele-zu-viele-Beziehung zwischen den Pfosten und KategorienRails 4 searchkick mit vielen-zu-vielen relationsip

Meine Modelle sind:

-- post.rb 
class Post < ActiveRecord::Base 
has_many :post_categories 
has_many :categories, through: :post_categories 
searchkick text_start: [:title] 
end 

-- category.rb 
class Category < ActiveRecord::Base 
    has_many :post_categories 
    has_many :posts, through: :post_categories 
end 

--post_category.rb 
class PostCategory < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :category 
end 

Jetzt in meinem posts_controller Index Aktion, ich habe die folgenden, die durch Rücksendung alle Beiträge bisher funktioniert, die passen der Abfrageparameter oder gibt alle Beiträge zurück, wenn in der Sucheingabe kein Abfrageparameter angegeben ist.

class PostsController < ApplicationController 

    def index 
     query = params[:q].presence || "*" 
     @posts = Post.search (query) 
    end 
end 

Dies funktioniert bisher gut. Ich möchte aber auch einen Kategoriefilter in der Ansicht hinzufügen, so dass der Benutzer wählen kann, ob er innerhalb einer bestimmten Kategorie nach der Abfragezeichenfolge suchen oder in allen Kategorien suchen möchte, wenn keine Kategorie ausgewählt ist. Danke im Voraus.

+0

Haben Sie versucht, sich selbst eine Kategorie auswählen, hinzufügen? –

Antwort

0

Wie seekkick Dokumentation können Sie Parameter zu .search Abfrage hinzufügen - siehe Abschnitt Abfragen, insbesondere wo. Probe von docs: - searchkick gem wandelt Bedingungen von wo Anweisung Elasticsearch Filter (siehe here)

aktualisieren - für die Suche nach Attributen

Product.search "apples", where: {in_stock: true}, limit: 10, offset: 50 

Sollte wie

Post.search query, where: {category: [some_array]} 

Hinweis smt werden von verwandten Objekten (nicht Modell selbst), sollten Sie seine Felder in search_index einschließen - siehe Beispiel here

Fügen Sie der search_data-Methode die Kategorietitel hinzu.

class Project < ActiveRecord::Base 
    def search_data 
    attributes.merge(
     categories_title: categories.map(&:title) 
    ) 
    end 
end 

Auch this Frage zu verwandten Thema

standardmäßig search_data von searchkick ist Rückkehr von serializable_hash Modell Anruf -siehe sources Referenz.

def search_data 
    respond_to?(:to_hash) ? to_hash : serializable_hash 
end unless method_defined?(:search_data) 

Welche etwas von Assoziationen standardmäßig nicht enthalten, es sei denn, mit übergeben: include Parameter - source

def serializable_hash(options = nil) 
    ... 
    serializable_add_includes(options) do .. 
end 

def serializable_add_includes(options = {}) #:nodoc: 
    return unless includes = options[:include] 
... 
end 
+0

Ja ich habe diese Methode schon ausprobiert aber nichts ergeben. Ich habe '@posts = Post.search (query) versucht, wobei {category: [" Wedding "]}' aber immer noch keine Ergebnisse liefert. nicht sicher, was ich vermisse. – Alex

+0

Nur für den Fall, prüfen Sie offensichtlich Syntaxfehler - rufen Sie 'Post.search (Abfrage, wobei: {..})' - alles innerhalb() –

+0

In der Regel vermeiden Sie Platz zwischen Methodenname und Klammer - schreiben Anruf (params) und nicht call (params) - Sie können leicht nach diesem suchen, z [hier] (http://stackoverflow.com/questions/7675093/spacing-around-parentheses-in-ruby) –