使用する必要があるかなり複雑な並べ替え関数があり、いくつかの結合と少しの計算が必要です。このため、これを標準の DataMapper 構文 ( などUser.all(:order => ...)
) に組み込む方法はありません。現在、私は次のようなものを持っています
repository(:default).adapter.select('
SELECT users.id, ( (count(table1.*) - count(table2.*))/((EXTRACT(EPOCH FROM current_timestamp)) ) as sort FROM users
LEFT JOIN table1
ON table1.user_id = users.id
LEFT JOIN table2
ON ...
AND ...
GROUP BY users.id
ORDER BY sort DESC')
ただし、これを DataMapper に統合して、任意の datamapper コレクションでこれを呼び出すことができるようにしたい
たとえば、User.all(:name => 'bob').crazy_sort_function
'bob' という名前のユーザーを特別な関数で並べ替えて返します。または、おそらくUser.all(:order => crazy_sort)
など...どのような定式化でも、これをデータマッパー ORM に可能な限りシームレスに統合します。
注: current_timestamp はクエリの一部であるため、これはすべての行を定期的にコンパイルして列に収めることができるものではありません。