NICE! You've figured out some cool stuff. I would have loved to have
known about <table-plus fields="*"> a month ago!
And :order_by => parse_sort_param(*standard_fields(model))) rocks. You
should write this up as a recipe!

Thanks,
Andy

On Jul 1, 3:00 am, Iain <[email protected]> wrote:
> I don't know if this is too late, but I have a nice solution to the
> duplication problem.
>
> First, I replaced the default index-page tag with one with a table,
> but configured so that the table is "opt-out" rather than "opt-
> in" (eg. by default all model fields are shown)
>
> <extend tag="index-page" attrs="skip">
>   <old-index-page merge>
>     <collection: replace>
>       <table-plus fields="*" skip="#{skip}" without-search-form>
>         <controls:/>
>       </table-plus>
>     </collection:>
>   </old-index-page>
> </extend>
>
> Here the key revelation was that you can use "*" to specify all
> fields. Then, in the controller, I've made it accept all fields as
> sort parameters:
>
>   include Hobo::RapidHelper
>
>   def index
>     hobo_index model.apply_scopes(:order_by => parse_sort_param
> (*standard_fields(model)))
>   end
>
> This uses the standard_fields method from RapidHelper on the model
> field (that's inherited by all hobo controllers)
>
> In this example I've turned off searching, because I haven't thought
> of a good way of determining the correct field to search on
> dynamically
>
> I hope that helps!
>
> On Jun 25, 2:40 am, Montgomery Kosma <[email protected]> wrote:
>
> > Where I had a complex situation -- though perhaps less complex as what
> > you're after -- I successfully used named scopes instead of hobo's
> > apply_scopes.  In my case I have atable-plusshowing custodians on my
> > project page, and wanted to make the search box find custodians.
>
> > In my case, I added two named scopes to my join class
> > (ProjectCustodian):
>
> >   named_scope :custodian_names_like, lambda { |search_for| (!
> > search_for.blank?) ? {:include => :custodian, :conditions =>
> > ["custodians.name LIKE ?", "%#{search_for}%"] } : nil }
>
> >   named_scope :sort_custodians_by, lambda { |sort_by|
> >     if !sort_by.blank?
> >       # fix custodian --> custodians
> >       klass=sort_by.first.split(".").first
> >       sort_by.first.gsub!(klass, klass.pluralize)
> >       {:include => :custodian, :order=> sort_by.join(' ')}
> >     else
> >       nil
> >     end
> >   }
>
> > and this is how I used them from my ProjectsController:
>
> >   def edit
> >     hobo_show do
> >       @project = find_instance
> >      order= parse_sort_param("custodian.name", "custodian.type",
> > "custodian.last_name")
> >       @project_custodians =
> > @project.project_custodians.custodian_names_like(params
> > [:search]).sort_custodians_by(order)
> >     end
> >   end
>
> > On Jun 24, 10:19 am, hobo_hippy <[email protected]> wrote:
>
> > > So Montgomery Kosma,
>
> > > def index
> > >     @timesheets = Timesheet.apply_scopes(:search => [params
> > > [:search], :name], :order_by => parse_sort_param
> > > (:name, :time, :client, :project, :user, :updated_at))
> > >     hobo_index @timesheets
>
> > > I've got one little modification I'd like to make. the search only
> > > looks at :name becuase that's stated here:
>
> > > (:search => [params[:search], :name]
>
> > > if I want to be able to search :name, :client, :project, and :user how
> > > can I modify this? i tried just adding the fields, but that doesn't
> > > work since client, project, and user are not @Timesheets, where I
> > > already told it to look. Do I have to write another search method
> > > inside index? How can I make it search across all models instead of
> > > one model?
>
> > > btw I get the following error message:
>
> > > Mysql::Error: Unknown column 'timesheets.user' in 'where clause':
> > > SELECT * FROM `timesheets` WHERE (((timesheets.name like '%CJ%') OR
> > > (timesheets.user like '%CJ%') OR (timesheets.client like '%CJ%') OR
> > > (timesheets.project like '%CJ%')))
>
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/abstract_adapter.rb:188:in `log'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/mysql_adapter.rb:309:in `execute'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/mysql_adapter.rb:563:in `select'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/abstract/database_statements.rb:7:in
> > > `select_all_without_query_cache'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/abstract/query_cache.rb:60:in `select_all'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/abstract/query_cache.rb:81:in `cache_sql'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > connection_adapters/abstract/query_cache.rb:60:in `select_all'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > base.rb:635:in `find_by_sql'
> > > /usr/lib/ruby/gems/1.8/gems/hobo-0.8.7/lib/hobo/model.rb:293:in
> > > `find_by_sql'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > base.rb:1490:in `find_every'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > base.rb:589:in `find'
> > > /usr/lib/ruby/gems/1.8/gems/hobo-0.8.7/lib/hobo/model.rb:286:in `find'
> > > /usr/lib/ruby/gems/1.8/gems/hobo-0.8.7/lib/hobo/scopes/
> > > named_scope_extensions.rb:20:in `send'
> > > /usr/lib/ruby/gems/1.8/gems/hobo-0.8.7/lib/hobo/scopes/
> > > named_scope_extensions.rb:20:in `method_missing'
> > > /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/
> > > base.rb:2003:in `with_scope'
> > > (__DELEGATION__):2:in `__send__'
> > > (__DELEGATION__):2:in `with_scope'
> > > (__DELEGATION__):2:in `is_a?'
> > > app/controllers/timesheets_controller.rb:9:in `index'
>
>
--~--~---------~--~----~------------~-------~--~----~
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