arturtr
arturtr

Reputation: 1115

Elasticsearch: filtering by group with tire gem

I want to filtering search by age groups.

Now I have: program.rb

class Program < ActiveRecord::Base
  has_many :age_groups, through: :programs_age_groups_relations
  include Tire::Model::Search
  include Tire::Model::Callbacks
  mapping do
    indexes :name, analyzer: 'snowball', boost: 100
    indexes :description, analyzer: 'snowball'
    indexes :age_groups do
      indexes :name, analyzer: 'snowball'
    end
  end

  def to_indexed_json
    to_json(include: {age_groups: {only: :name}})
  end
  def self.search(params, options={})
    tire.search(load: {include: 'age_groups'}) do
      query do
        boolean do
          must { string params[:name_query] } if params[:name_query].present?
        end
      end

    filter do
      boolean do
        if params[:age_groups].present?
          params[:age_groups].each do |ag_name|
            must { string ag_name }
          end
        end
      end
    end
  end
end

index.html.haml

= form_tag programs_path, method: :get do |f|
  = text_field_tag :name_query, params[:name_query]
  - AgeGroup.all.each do |ag|
    = check_box_tag 'age_groups[]', ag.name, params[:age_groups].include?(ag.name)

in controller:

@programs = Program.search(params)

Age Groups:

AgeGroup.create([{name: 'Baby'}, {name: 'Toddler'}, {name: 'Preschoolers'}, {name: 'Elementary'}, {name: 'Middle School'}])

Realtion:

class ProgramsAgeGroupsRelation < ActiveRecord::Base
  attr_accessible :age_group_id, :program_id
  belongs_to :age_group
  belongs_to :program
end

When I check one or more age_groups in search form nothing was happened with search result.

How can I correctly use tire for this task?

Upvotes: 0

Views: 1086

Answers (1)

karmi
karmi

Reputation: 14419

I'm not sure I understand your question, but please check this StackOverflow answer: Elasticsearch, Tire, and Nested queries / associations with ActiveRecord for info on ActiveRecord associations with Tire.

Once you have that sorted out, please update your question, as “nothing was happened with search result” hints at some kind of failed expectation, but I don't know which one.

Upvotes: 2

Related Questions