Я думаю, что ключевая проблема: ActiveRecord API не знает о порядке семантики . Он просто принимает строку и обходит базовую базу данных. К счастью, Sqlite, MySQL и PostgreSQL не имеют различий в синтаксисе order
.
Я не думаю, что ActiveRecord может сделать эту абстракцию хорошо, и ей не нужно это делать. Он хорошо работает с реляционными базами данных, но его трудно интегрировать с NoSQL, например. MongoDB.
DataMapper , другой известный Ruby ORM, улучшил абстракцию. Взгляните на его синтаксис запроса :
@zoos_by_tiger_count = Zoo.all(:order => [ :tiger_count.desc ])
API осведомлен о семантике упорядочения. По умолчанию DataMapper сгенерирует оператор заказа SQL:
https://github.com/datamapper/dm-do-adapter/blob/master/lib/dm-do-adapter/adapter.rb#L626-634
def order_statement(order, qualify)
statements = order.map do |direction|
statement = property_to_column_name(direction.target, qualify)
statement << ' DESC' if direction.operator == :desc
statement
end
statements.join(', ')
end
Однако возможно переопределить на уровне адаптера БД:
https://github.com/solnic/dm-mongo-adapter/blob/master/lib/dm-mongo-adapter/query.rb#L260-264
def sort_statement(conditions)
conditions.inject([]) do |sort_arr, condition|
sort_arr << [condition.target.field, condition.operator == :asc ? 'ascending' : 'descending']
end
end
TL; DR:
- Вам не нужно беспокоиться о синтаксической проблеме, если вы используете только SqlLite, Mysql и PostgreSQL.
- Для лучшей абстракции вы можете попробовать DataMapper.