Thank you very much Pat. I understand you have gone very far to help me. Will make another donation again when I am able in future. Thank you again.
On Nov 11, 11:42 am, Pat Allan <[email protected]> wrote: > 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 > > ... > > 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.
