Rails Поиск вычисляемых полей с использованием metasearch и metawhere
Кто-нибудь был в состоянии найти способ поиска вычисляемого поля с помощью мета-места или метапоиска в рельсах 3? Я могу искать любое поле, кроме рассчитанных полей. Должен быть способ. Для тех, кто не знаком с метапоиском или мета-локацией, здесь есть Railscast.
1 ответ
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")