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.

Reply via email to