Hi Victor I'm afraid I'm at a loss as to what the problem is... as far as I can tell (though it's a little difficult without the full site's code in front of me) there's nothing wrong in your indexes or controller code.
Sorry - I wish I could help more, but I just don't know what the cause of these problems are. -- Pat On 10/11/2010, at 5:08 PM, Victor wrote: > Hi Pat, > > Still couldn't get it working after multiple trial-error. > > Maybe I can just set the search result to sort by 'rating_average > DESC', that's all. Tried numerous places too couldn't get it right. > Where should I put it? > > Am removing the sorting filter. > > Thanks. > > On Nov 9, 1:05 am, Victor <[email protected]> wrote: >> Hi Pat, >> >> Thanks for the heads-up. >> >> I have played around, and got the trip.name and trip.duration working, >> but not the order (rating_average, created_at). I have tried indexing >> both "rating_average" and "created_at", but couldn't get it work. >> >> The following configuration works for spots (all), trip name, trip >> duration. >> >> trip_day.rb >> =========== >> # ThinkingSphinx Index >> define_index do >> indexes spots.name, :as => :spot_name >> indexes spots.city, :as => :spot_city >> indexes spots.state, :as => :spot_state >> indexes spots.country, :as => :spot_country >> indexes trip.name, :as => :name >> indexes trip.duration, :as => :duration >> has trip.budget, :as => :budget >> has trip.created_at, :as => :created_at >> has trip.rating_average, :as => :rating_average >> has trip_id >> end >> >> trip.rb >> ======== >> # ThinkingSphinx Index >> define_index do >> indexes name >> indexes duration >> #indexes spots.name, :as => :trip_spot_name >> #indexes spots.city, :as => :trip_spot_city >> #indexes spots.state, :as => :trip_spot_state >> #indexes spots.country, :as => :trip_spot_country >> has budget, created_at, rating_average >> end >> >> On Nov 8, 8:25 pm, Pat Allan <[email protected]> wrote: >> >>> Hi Victor >> >>> I think duration and name should be fields (given that's what they were >>> originally) - so use 'indexes' instead of 'has'. This will ensure they're >>> actually treated as string data for search queries. >> >>> -- >>> Pat >> >>> On 08/11/2010, at 5:12 PM, Victor wrote: >> >>>> Hey Pat, >> >>>> I'm suspecting TripDay couldn't index using this: >> >>>> has trip.budget, :as => :budget >>>> has trip.created_at, :as => :created_at >>>> has trip.rating_average, :as => :rating_average >> >>>> The duration that works mentioned above, could be directly from >>>> indexes of Trip instead. >> >>>> On Nov 6, 11:25 pm, Victor <[email protected]> wrote: >>>>> Almost there, Pat, almost there! >> >>>>> trip_day.rb >>>>> =========== >> >>>>> class TripDay < ActiveRecord::Base >>>>> belongs_to :trip >> >>>>> has_many :trip_day_spots >>>>> has_many :spots, :through => :trip_day_spots >> >>>>> # ThinkingSphinx Index >>>>> define_index do >>>>> indexes spots.name, :as => :spot_name >>>>> indexes spots.city, :as => :spot_city >>>>> indexes spots.state, :as => :spot_state >>>>> indexes spots.country, :as => :spot_country >>>>> has trip_id >>>>> has trip.name, :as => :name >>>>> has trip.duration, :as => :duration >>>>> has trip.budget, :as => :budget >>>>> has trip.created_at, :as => :created_at >>>>> has trip.rating_average, :as => :rating_average >>>>> end >>>>> end >> >>>>> trips_controller.rb >>>>> ============ >> >>>>> class TripsController < ApplicationController >>>>> before_filter :require_user, :except => [:show, :index] >> >>>>> def index >>>>> if params[:filter] == 'on' >>>>> country = params[:country] == 'All' ? {} : {:spot_country => >>>>> params[:country]} >>>>> duration = params[:days].blank? ? "" : params[:days] >> >>>>> if !duration.blank? && country >>>>> conditions = {:duration => duration}.merge(country) >>>>> elsif !duration.blank? && country.blank? >>>>> conditions = {:duration => duration} >>>>> else country && duration.blank? >>>>> conditions = country >>>>> end >> >>>>> keyword = params[:keyword].blank? ? "" : params[:keyword] >> >>>>> case params[:order] >>>>> when 'date_descend' >>>>> order = {:order => 'created_at DESC'} >>>>> when 'date_ascend' >>>>> order = {:order => 'created_at ASC'} >>>>> when 'rating_descend' >>>>> order = {:order => 'rating_average DESC'} >>>>> when 'rating_ascend' >>>>> order = {:order => 'rating_average ASC'} >>>>> when 'budget_dscend' >>>>> order = {:order => 'budget DESC'} >>>>> when 'budget_ascend' >>>>> order = {:order => 'budget ASC'} >>>>> else >>>>> order = {} >>>>> end >> >>>>> #results = Trip.search params[:keyword], {:conditions => >>>>> conditions, :star => true}.merge(order) >>>>> #...@trips = results.paginate(:page => params[:page]) >>>>> @trip_days = TripDay.search(params[:keyword], { >>>>> :conditions => conditions, >>>>> :star => true, >>>>> :group_by => 'trip_id', >>>>> :group_function => :attr, >>>>> :page => params[:page] >>>>> }.merge(order)) >>>>> @trips = @trip_days.collect { |trip_day| trip_day.trip } >>>>> else >>>>> @trips = Trip.paginate(:all, :page => params[:page], :order => >>>>> 'created_at DESC') >>>>> end >>>>> end >>>>> end >> >>>>> Trip's index.html.erb, I have changed: >> >>>>> From >>>>> <%= pluralize @trips.total_entries, 'trip' %></span> >>>>> To >>>>> <%= pluralize @trip_days.total_entries, 'trip' %></span> >> >>>>> From >>>>> <%= will_paginate @trips %> >>>>> To >>>>> <%= will_paginate @trip_days %> >> >>>>> Other attributes in Trip's index.html.erb refers directly to Trip, >>>>> with this tag: <% @trips.each do |trip| %> which works fine. >> >>>>> Other filter such as trip.duration, spot.address, spot.name all worked >>>>> fine. >> >>>>> Now one last problem here: >>>>> I can't filter by the "trip.name", and can't sort by "rating_average" >>>>> and "created_at" even though I have put them in "trip_day.rb". >> >>>>> On Nov 6, 7:21 am, Pat Allan <[email protected]> wrote: >> >>>>>> Ah, I removed the pagination with the collect... of course. >> >>>>>> Probably best to keep the trip_day objects separate, and use that for >>>>>> pagination: >> >>>>>> @trip_days = TripDay.search(params[:keyword], { >>>>>> :conditions => conditions, >>>>>> :star => true, >>>>>> :group_by => 'trip_id', >>>>>> :group_function => :attr, >>>>>> :page => params[:page] >>>>>> }.merge(order)) >>>>>> @trips = @trip_days.collect { |trip_day| trip_day.trip } >> >>>>>> And then, you can use @trips for looping through results, and @trip_days >>>>>> for pagination information (ie: total_entries). >> >>>>>> However, this doesn't get around the attribute issue. You could pull the >>>>>> attributes all into the TripDay index: >> >>>>>> has trip.budget, :as => :budget >>>>>> has trip.created_at, :as => :created_at >>>>>> has trip.rating_average, :as => :rating_average >> >>>>>> This is a pretty massive workaround just because the Trip index isn't >>>>>> working as we'd like, though... >> >>>>>> -- >>>>>> Pat >> >>>>>> On 05/11/2010, at 5:21 PM, Victor wrote: >> >>>>>>> Argh, it was in the search function you added: >> >>>>>>> @trips = TripDay.search(params[:keyword], { >>>>>>> :conditions => conditions, >>>>>>> :star => true, >>>>>>> :group_by => 'trip_id', >>>>>>> :group_function => :attr, >>>>>>> :page => params[:page] >>>>>>> }.merge(options)).collect { |trip_day| trip_day.trip } >> >>>>>>> I changed the last line .merge(options) to .merge(order) and I "think" >>>>>>> it is going there now! Great. >> >>>>>>> Now when the app tries to render the index.html.erb to show the search >>>>>>> results, it gives me this: >> >>>>>>> ActionView::TemplateError (undefined method `total_entries' for >>>>>>> []:Array) on line #11 of app/views/trips/index.html.erb: >>>>>>> 8: <% if params[:filter] == 'on' %> >>>>>>> 9: <h1> >>>>>>> 10: Showing <span id="total-results" class="filtered"> >>>>>>> 11: <%= pluralize @trips.total_entries, >>>>>>> 'trip' %></span> >>>>>>> 12: <% if !params[:keyword].blank? %> >>>>>>> 13: on <span id="keywords" class="filtered"><%= >>>>>>> params[:keyword] %></span> >>>>>>> 14: <% end %> >> >>>>>>> I think this is probably because it is searching in TripDay and there >>>>>>> are no attributes found in TripDay. >> >>>>>>> What should I do to display the attributes from Trip instead of >>>>>>> TripDay? Because this happens to my wildcard search too. >> >>>>>>> On Nov 5, 2:05 pm, Pat Allan <[email protected]> wrote: >>>>>>>> What about in your controller? >> >>>>>>>> -- >>>>>>>> Pat >> >>>>>>>> On 05/11/2010, at 5:01 PM, Victor wrote: >> >>>>>>>>> When I performed a search, the following 500 occured: >> >>>>>>>>> Processing TripsController#index (for 115.164.60.198 at 2010-11-05 >>>>>>>>> 13:50:19) [GET] >>>>>>>>> Parameters: {"country"=>"All", "days"=>"", "action"=>"index", >>>>>>>>> "filter"=>"on", "order"=>"date_descend", "controller"=>"trips", >>>>>>>>> "keyword"=>"mid valley"} >> >>>>>>>>> NameError (undefined local variable or method `options' for >>>>>>>>> #<TripsController:0xb693d44>): >> >>>>>>>>> I did not have any variable "options" anywhere in my trip.rb, or >>>>>>>>> Trip's index.html.erb. >> >>>>>>>>> On Nov 4, 9:37 pm, Victor <[email protected]> wrote: >>>>>>>>>> Sorry Pat, we posted at the same time. Will get back to you when I >>>>>>>>>> have tried that. Thanks. >> >>>>>>>>>> On Nov 4, 9:29 pm, Victor <[email protected]> wrote: >> >>>>>>>>>>> Hi Pat, >> >>>>>>>>>>> I am sorry that I may need step-by-step guide here. >> >>>>>>>>>>> Ok, I have added "has trip_id" in the TripDay model. >> >>>>>>>>>>> Next is the trips_controller.rb. If you see my code above, I have >>>>>>>>>>> also >>>>>>>>>>> added ":group_by => trip_id" and ":group_function => :attr" to the >>>>>>>>>>> Trip.search. >> >>>>>>>>>>> The filter form is in my Trips' index.html.erb. I notice that I >>>>>>>>>>> haven't really included the Trip.search to search TripDay as well >>>>>>>>>>> because when I search, it >> >> ... >> >> read more ยป > > -- > You received this message because you are subscribed to the Google Groups > "Thinking Sphinx" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/thinking-sphinx?hl=en. > -- You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.
