Names of models in my application have accented characters that imply unexpected orderings. For instance ?vila should go before Madrid, but String#<=> puts it the other way aroud. I am only sorting for views, so it would be OK to do some normalization on-the-fly on Ruby land, and since the same criteria has to be used throughout the application I was thinking on some sort of generator whose usage would be: class User < ActiveRecord::Base normalize_for_sorting :surname end The intention is not to modify surname, we need it in the views, normalize_for_sroting would generate a method User#surname_for_sorting and configure it as a creation/finding filter that applies the necessary tr///. The aim is: * We normalize the strings once and store them in attributes instead of applying the normalizer in all sort blocks * The tr///, the configuration of filters, etc. is written in one place, following DRY. I think that can be done, but I am not fluent enough yet in Rails to determine whether it is a clean solution, and how to implement it in an idiomatic way. Any advices? -- fxn
How about modifying your data before putting it in the database?? That''s how i do the "trick". ==class User < ActiveRecord::Base def before_save self.surname_for_sorting = normalize_for_sorting :surname end end == or.. if you don''t want extra data in the db, and format it for every request. ==class User < ActiveRecord::Base def surname_for_sorting @sfs = normalize_for_sorting(:surname) if !@sfs @sfs end end == If you desperately want more DRY, make it a mixin. -- Posted via http://www.ruby-forum.com/.
On Feb 19, 2006, at 22:53, Colin wrote:> or.. if you don''t want extra data in the db, and format it for every > request. > > ==> class User < ActiveRecord::Base > > def surname_for_sorting > @sfs = normalize_for_sorting(:surname) if !@sfs > @sfs > end > end > ==> > If you desperately want more DRY, make it a mixin.What I have in mind is: a class method for models that generates _for_sorting accessors on-the-fly based on parameters, and that creates callbacks after_(save|find) that initialize those attributes. I guess class_eval is all what I need, but which is the idiomatic way to define normalize_for_sorting so that is visible in all models? Do I open ActiveRecord::Base and add the method? If that''s the way, where do I do that? In which file? -- fxn