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 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
>
> ...
>
> 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.