Metawhere (теперь Squeel) расширяет реализацию ActiveRecord Arel, который является генератором SQL. Это означает, что он превратит некоторые операторы в SQL, например:
@user.order("birthday").to_sql #=> SELECT users.* FROM users ORDER BY birthday
Когда вы делаете User.find(:all).sort_by(&:age)
, вы работаете с результатом find (: all), Array, и сортировка выполняется в Ruby с Enumerable, который работает медленнее и не имеет никакого отношения к базе данных .
Так что нет, вы не можете использовать Metawhere на
def age
date.today - birthday
end
, если вы не сохраните результат в базе данных.
Однако вы можете использовать операторы SQL, такие как COUNT AVG MAX и т. Д. С GROUP и HAVING, чтобы выполнять вычисления непосредственно в базе данных.
User.select("users.*, COUNT(user_id) AS vote_num").joins(:votes).group("user_id")