Update:

I needed to add a virtual, calculated column (i.e. field a divided by
field b) and that broke the searching and sorting that I mentioned
above.  Rather than adding further complexity to the Rails app, I
decided to move it to the db by creating a view.  I've ripped out all
the custom searching and sorting code because the vanilla search/sort
works just fine on the view.

On Apr 6, 10:33 am, Kjersten <[email protected]> wrote:
> This discussion has been extremely helpful.  I just wanted to add a
> couple of things in case it helps anyone else:
>
> As Matt said, you can substitute "@klass" with "self".
>
> I wanted to be able to sort on various columns of the associated
> table.  This is tricky because the Hobo "order_by" code in
> automatic_scopes.rb limits you to sorting on the name column of a
> belongs_to associated table (by specifying the relationship name, e.g.
> 'user', without giving a column, e.g. 'user.age').  To get around this
> limitation, Tuishimi eagerly-loaded the associated tables in another
> named_scope before applying the sort function.
>
> I am working with Rails 2.3.11 and Oracle so this method works fine
> for small sets of data but breaks on larger data sets.  When Rails
> does eager loading, it uses a query like this (select * from
> related_table where id in
> (list_of_distinct_related_ids_from_base_table)).  When my table has
> thousands of records, Rails sometimes tries to pull thousands of
> records from the related table.  Oracle limits the number of arguments
> in an IN clause to 1,000 so I would need to change the Oracle default
> limit or use a workaround like the one detailed 
> herehttp://www.ruby-forum.com/topic/164681.  I could also try to get the
> company to run a solr index for the app but that's not going to happen
> at this stage of the project. :)
>
> A quicker solution to the problems with eager-loading large record
> sets from Oracle is to add an "order_by" scope to the AR class:
>
>   # INFO: this will die nastily if searching on associations that
> don't match table names; need to use reflections
>   named_scope :order_by, lambda { |*args|
>     field, asc = args
>     associated = field.gsub(/\..*$/,'') if field.include?('.')
>     field_name = field =~ /^([^.]+)\.(.*)$/ ?
> "#{$1.pluralize}.#{$2}" : "#{self.table_name}.#{field}"
>     if associated.blank?
>       { :order => "#{field_name} #{asc._?.upcase}" }
>     else
>       { :order => "#{field_name} #{asc._?.upcase}", :include=>
> associated }
>     end
>   }
>
> It's just a slight modification of Matt's "search" named_scope so it
> only works as long as the association name matches the table_name.  A
> nice side-benefit is that you don't need to manually pluralize
> table_names in the dryml template like you do for the Hobo order_by
> scope:
>
>     <table-plus fields="user.last_name, user.first_name,
> registered_on, graduated_on, inactive" sort-
> columns="&{'user.last_name' => 'users.last_name', 'user.first_name' =>
> 'users.first_name'}">
>
> - Kjersten
>
> On Mar 17, 5:43 pm, Matt Jones <[email protected]> wrote:
>
>
>
>
>
>
>
> > On Mar 17, 2011, at 4:18 PM, Tuishimi wrote:
>
> > > Looked like that was a typo?  So I changed the code to be
> > > #[email protected]_name} but now I am getting this error:
>
> > > undefined method `table_name' for nil:NilClass... it doesn't like
> > > @klass...?
>
> > Yeah, that's a leftover from the method in automatic_scopes.rb that I used 
> > to make that scope - I think the equivalent in a scope would be 'self', but 
> > I'm not sure.
>
> > --Matt Jones

-- 
You received this message because you are subscribed to the Google Groups "Hobo 
Users" 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/hobousers?hl=en.

Reply via email to