[Rails] Help with sorting arrays with objects in it

dblack at wobblini.net dblack at wobblini.net
Thu Jun 1 12:11:36 GMT 2006


Hi --

On Thu, 1 Jun 2006, Jake Smith wrote:

> @list.sort! do |a, b|
>      cmp = (a.title <=> b.title)
>      if cmp == 0
>          cmp = (a.price <=> b.price)
>      end
>      next cmp
>  end
>
> One question though, if .title or .price are being passed in as a string,
> how do i use that?
>
> # i know this wont work, just trying to help explain
> def sort_objects(objects,sortyby)
>      cmp = (a.sortby <=> b.sortby
>      if cmp == 0
>          cmp = (a.sortby <=> b.sortby)
>      end
>      next cmp
> end

Does this help?

   def sort_objects(objects,field)
     objects.sort_by {|obj| obj.send(field) }
   end


David


>
> Thanks so much
>
> On 5/31/06, David Balmain <dbalmain.ml at gmail.com> wrote:
>> 
>> On 6/1/06, Jake Smith <rndholesqpeg at gmail.com> wrote:
>> > I have to build an array through both activerecord and also through a
>> ferret
>> > index.
>> >
>> > I was hoping to find a way of sorting the array as i combine the two so
>> >
>> > def advanced_search(search_text, store, format, sortby)
>> >
>> > # find items in ferret index
>> > items = Item.find_by_contents(search_text)
>> >
>> > # and now find all the items from a certain store or category
>> > items_from_sql =  Item.find_by_sql("SELECT * .....")
>> >
>> > @list = []
>> > items.each do |i|
>> >   @list << i    if items_from_sql.include?(i)
>> > end
>> >
>> > #now i need to sort @list somehow with sortby which would equal "title"
>> or
>> > "price"
>> > ??????
>> >  ??????
>> >
>> > end
>> 
>> Hi Jake,
>> 
>> I'd do the whole thing through Ferret;
>>
>>     items = Item.find_by_contents(search_text, :sort => ["title",
>> "price"])
>> 
>> I'm not sure what your SQL query is but I'm pretty sure it could be
>> handled in Ferret. Let's say you wanted to get all times with the
>> subject of "Ruby" or "Rails". Instead of;
>>
>>     items_from_sql =  Item.find_by_sql("SELECT * items WHERE subject =
>> 'Ruby' OR subject = 'Rails'")
>> 
>> You'd do this;
>>
>>     items = Item.find_by_contents(search_text + " +subject:(Ruby Rails)",
>>                   :sort => ["title", "price"])
>> 
>> Or even better if speed is important, you could use a QueryFilter;
>>
>>     # first you'd create a FILTER constant
>>     # NOTE: since we are creating the query directly we need to lowercase
>> the
>>     # terms which would usually be done by the QueryParser
>>     bq = BooleanQuery.new()
>>     bq.add_query(TermQuery.new(Term.new("subject", "ruby"),
>>                            BooleanClause::Occur::Should)
>>     bq.add_query(TermQuery.new(Term.new("subject", "rails"),
>>                            BooleanClause::Occur::Should)
>>     FILTER = QueryFilter.new(bq)
>>
>>     def advanced_search(search_text, store, format, sortby)
>>
>>         items = Item.find_by_contents(search_text,
>>                   :filter => FILTER,
>>                   :sort => ["title", "price"])
>>         #...
>>     end
>> 
>> Hope that helps. Of course sorting arrays is easy to.
>>
>>     @list.sort! do |a, b|
>>         cmp = (a.title <=> b.title)
>>         if cmp == 0
>>             cmp = (a.price <=> b.price)
>>         end
>>         next cmp
>>     end
>> 
>> Cheers,
>> Dave
>> _______________________________________________
>> Rails mailing list
>> Rails at lists.rubyonrails.org
>> http://lists.rubyonrails.org/mailman/listinfo/rails
>> 
>

-- 
David A. Black (dblack at wobblini.net)
* Ruby Power and Light, LLC (http://www.rubypowerandlight.com)
   > Ruby and Rails consultancy and training
* Author of "Ruby for Rails" from Manning Publications!
   > http://www.manning.com/black


More information about the Rails mailing list