That helps a lot with sorting and I am going to test out your scope as
well!  Thank you so much!

On Mar 16, 12:25 pm, Matt Jones <[email protected]> wrote:
> On Mar 16, 2011, at 3:02 PM, Tuishimi wrote:
>
>
>
>
>
> > I have a model that contains mostly ID values that link it to other
> > tables.  Users want to be able to view the "pretty" data, not IDs.
> > That is easy to do (in table-plus, view fields things like
> > "xyz.name").
>
> > But, they also want to search and sort on those "pretty values."  For
> > example.  FOO_ID points to table FOO, which has a field called BAR
> > that contains a nice long string.  My table plus field contains a
> > reference to "foo.bar" to pull that data into the table view.  Let's
> > say out of 1000 rows, 10 contain the string "squirrels eat nuts".  The
> > user wants to be able to type in "squirrels" in the search box and
> > find all rows with that value.  But what happens is the search fails
> > because there is no such field called foo.bar, it's a magical
> > reference that rails works hard to fill in for me during the process
> > of displaying the page.  The REAL value is FOO_ID which is some
> > numeric value.
>
> > What is the best way to approach this?  How do I even begin?  I also
> > need to sort on these same fields (and I want to sort by the text, not
> > the ID values).
>
> Here's a scope I've used in some live apps to search by associated fields:
>
>   # TODO: merge this logic back to Hobo core
>   # TODO: this will die nastily if searching on associations that don't match 
> table names; need to use reflections
>   named_scope :search, lambda { |query, *fields|
>     return { :conditions => '(1=1)' } if query.blank?
>     words = query.split
>     args = []
>     associated = fields.select { |f| f.to_s.include?('.') }.map { |f| 
> f.to_s.gsub(/\..*$/,'') }
>     word_queries = words.map do |word|
>       field_query = '(' + fields.map { |field| field.to_s =~ 
> /^([^.]+)\.(.*)$/ ? "(#{$1.pluralize}.#{$2} like ?)" : 
> "(#[email protected]_name}.#{field} like ?)" }.join(" OR ") + ')'
>       args += ["%#{word}%"] * fields.length
>       field_query
>     end
>
>     if associated.empty?
>       { :conditions => [word_queries.join(" AND ")] + args }
>     else
>       { :conditions => [word_queries.join(" AND ")] + args, :include => 
> associated.*.to_sym }
>     end
>   }
>
> Note that this isn't entirely generic: it assumes that you're using the 
> default naming conventions for your belongs_to associations, and will 
> generate invalid SQL if you aren't. That's why it hasn't been added to Hobo 
> yet. :)
>
> On the sorting front, you can already pass a table-qualified reference to 
> parse_sort_param:
>
> parse_sort_param('users.first_name', 'users.last_name', :registered_on, 
> :graduated_on, :inactive)
>
> (for the standard order_by Hobo scope). The only gotcha is that the field 
> name here is NOT the one that table-plus wants (users.first_name vs. 
> user.first_name), so you'll need to help it out:
>
>     <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'}">
>
> Yes, it's messy - but it works! Ideally we'd get this working so table-plus 
> knows how to do this itself.
>
> Hope this helps!
>
> --Matt Jones- Hide quoted text -
>
> - Show quoted text -

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