Event
ランク別に注文したいアクティブレコードモデルがあります。ランクは、重み付けされたプロパティの合計になります。たとえば、次のようなロジックでイベントをランク付けしたい場合があります。
LOG(number of followers) + (7 - number of days from now)
以下は機能しますが、関係オブジェクトではなく結果セットを返すため、満足のいくものではありません。したがって、スコープとして扱うことはできません。(参考までに、PostGIS拡張機能を備えたPostgresを使用しています)
x = Event.find_by_sql("
SELECT
(
CASE WHEN COUNT(follows.*) = 0
THEN 0
ELSE LOG(COUNT(follows.*)) END
+
SIGN(7 - (EXTRACT(EPOCH FROM start) - EXTRACT(EPOCH FROM NOW())) / 86400) * LOG(ABS(7 - (EXTRACT(EPOCH FROM start) - EXTRACT(EPOCH FROM NOW())) / 86400))
) as score,
events.*
FROM events
LEFT OUTER JOIN follows
ON events.id = follows.followable_id AND follows.followable_type = 'Event' AND follows.blocked = 'f'
WHERE (events.start > NOW()) AND (ST_DWithin(st_setsrid(st_point(#{@location[:lng]}, #{@location[:lat]}), 4326), st_transform(loc, 4326), 48280.2, true))
GROUP BY events.id
ORDER BY 1 DESC
")
テーブルにカウンター キャッシュを追加して結合を回避できることは理解していEvents
ますが、将来的には他の関連付けを通じてランクを計算したいので、その方法を知っておくと非常に役立ちます。
ありがとう