0

I'm trying to do a sorted search using the tire gem but i always get this error:

Parse Failure [No mapping found for [occupation] in order to sort on]]

what's wrong with my code? following is my user model

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :occupation

  field :name, :type => String, :default => ""
  field :email, :type => String, :default => ""
  field :kind, :type => String, :default => ""

  def to_indexed_json
    { id: id,
      name: name,
      email: email,
      kind: kind,
      occupation: occupation.try(:name),
      created_at: created_at,
      updated_at: updated_at
    }.to_json
  end

  mapping do
    indexes :id, :type => 'integer'
    indexes :name, :type => 'String'
    indexes :email, :type => 'String'
    indexes :kind, :type => 'String'
    indexes :occupation, :type => 'String'
    indexes :created_at, :type => 'Date'
    indexes :updated_at, :type => 'Date'
  end

  def self.search q, params={}
    tire.search page: (params[:page] || 1)  do |search|
      search.query do |query|
        query.string q
      end
      search.sort do |sort|
        sort_column = params[:sort] || 'occupation'
        sort_direction = params[:direction] || 'asc'
        sort.by(sort_column.to_sym, sort_direction)
      end
    end
  end
end
danielgatis
  • 737
  • 7
  • 19

1 Answers1

0

Can you try this? I guess you are sending occupation.name in to_indexed_json and you are trying to sort on the entire occupation model.

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :occupation

  field :name, :type => String, :default => ""
  field :email, :type => String, :default => ""
  field :kind, :type => String, :default => ""

  def to_indexed_json
    { id: id,
      name: name,
      email: email,
      kind: kind,
      occupation: occupation.try(:name),
      created_at: created_at,
      updated_at: updated_at
    }.to_json
  end

  mapping do
    indexes :id, :type => 'integer'
    indexes :name, :type => 'String'
    indexes :email, :type => 'String'
    indexes :kind, :type => 'String'
    indexes :occupation, :type => 'object' do
        indexes :name, :type => 'String'
    end
    indexes :created_at, :type => 'Date'
    indexes :updated_at, :type => 'Date'
  end

  def self.search q, params={}
    tire.search page: (params[:page] || 1)  do |search|
      search.query do |query|
        query.string q
      end
      search.sort do |sort|
        sort_column = params[:sort] || 'occupation.name'
        sort_direction = params[:direction] || 'asc'
        sort.by(sort_column, sort_direction)
      end
    end
  end
end
Vamsi Krishna
  • 3,742
  • 4
  • 20
  • 45