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.

Reply via email to