On Monday, March 23, 2015 at 5:13:40 PM UTC-7, Janko Marohnić wrote:
>
> Hi Jeremy (again :)),
>
> ActiveRecord 4 (I think) added a nice improvement to the ordering syntax:
>
> Movie.order(:title => :asc, :year => :desc)
>
> I really like this syntax, because it's natural to use and very readable. 
> While I'm happy that Sequel has so many different ways of writing queries, 
> I still wasn't quite happy with ordering. I find `Sequel.desc(:year)` 
> slighly verbose. `:year.desc` reads really nice, though, but you have to 
> include core_extensions for that.
>
> I feel like ordering is common enough to deserve a more fluent syntax. If 
> you think this syntax would be cool as well, I'd gladly make a pull request 
> :)
>

This can't be used in the core as it breaks backwards compatibility and 
violates the general rule in Sequel that hashes are used for expressions. 
 Currently your code is valid Sequel and results in:

  SELECT * FROM movies ORDER BY ((title = asc) AND (year = desc))

Ordering on boolean expressions is supported on most SQL databases, where 
false generally sorts before true.

A simpler solution to what you want in Sequel is to use a virtual row block:

  Movie.order{[:title, year.desc]}

Note that on ruby 2.0+, you can use the core_refinements extension to 
enable :year.desc to work in a given file without it having a global effect.

If you wanted to support the ActiveRecord syntax, you'd have to add a new 
method for it, or you have to add it as an extension that overrode order 
and related methods to add special handling for hash arguments.  Because of 
the ease of doing this with virtual row blocks, I think it would be better 
to do this as an external library instead of included with Sequel.

Thanks,
Jeremy

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to