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 still returns zero result. How should I add > > >>>>> that? > > > >>>>> Thanks for your help. Really appreciate it. > > > >>>>> On Nov 4, 9:17 pm, Pat Allan <[email protected]> wrote: > > > >>>>>> No worries about being a noob - we've all got to start somewhere :) > > > >>>>>> Yes, you need to add 'has trip_id' to the define_index block in your > > >>>>>> TripDay model - if the attribute doesn't exist, you won't be able to > > >>>>>> group by it. > > > >>>>>> Cheers > > > >>>>>> -- > > >>>>>> Pat > > > >>>>>> On 03/11/2010, at 7:11 PM, Victor wrote: > > > >>>>>>> Hi Pat > > > >>>>>>> Here are the models so far: > > > >>>>>>> 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 > > >>>>>>> end > > >>>>>>> end > > > >>>>>>> Trip.rb > > >>>>>>> ======= > > >>>>>>> class Trip < ActiveRecord::Base > > >>>>>>> belongs_to :user, :counter_cache => true > > > >>>>>>> has_many :spot_trips, :dependent => :destroy > > >>>>>>> has_many :spots, :through => :spot_trips > > > >>>>>>> has_many :trip_days, :dependent => :destroy > > >>>>>>> has_many :trip_reviews, :dependent => :destroy > > > >>>>>>> # ThinkingSphinx Index > > >>>>>>> define_index do > > >>>>>>> indexes :name, :sortable => true > > >>>>>>> indexes duration > > >>>>>>> has budget, created_at, rating_average > > >>>>>>> end > > >>>>>>> end > > > >>>>>>> trip_day already belongs to Trip. Must I put in "has trip_id" in > > >>>>>>> trip_day.rb? > > > >>>>>>> Sorry for being a noob here. > > > >>>>>>> Thanks. > > > >>>>>>> On Nov 3, 2:43 pm, Pat Allan <[email protected]> wrote: > > >>>>>>>> Hi Victor > > > >>>>>>>> Well, it's great that it works here. > > > >>>>>>>> 1. You are indeed right, you're indexing columns from the spots > > >>>>>>>> association as fields. > > >>>>>>>> 2. You could add an attribute of trip_id to TripDay's index: > > >>>>>>>> has trip_id > > >>>>>>>> And then group the results by > > >>>>>>>> trip_id...http://freelancing-god.github.com/ts/en/searching.html#grouping > > > >>>>>>>> That said, it *should* work for Trip. Perhaps try stopping Sphinx, > > >>>>>>>> deleting the index files, and then run rake ts:rebuild to generate > > >>>>>>>> it all from scratch for sure? > > > >>>>>>>> -- > > >>>>>>>> Pat > > > >>>>>>>> On 03/11/2010, at 4:55 PM, Victor wrote: > > > >>>>>>>>> Hi Pat, > > > >>>>>>>>> I have added indexes to the following > > > >>>>>>>>> trip_day.rb > > ... > > 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.
