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.