Rails Поиск вычисляемых полей с использованием metasearch и metawhere

Кто-нибудь был в состоянии найти способ поиска вычисляемого поля с помощью мета-места или метапоиска в рельсах 3? Я могу искать любое поле, кроме рассчитанных полей. Должен быть способ. Для тех, кто не знаком с метапоиском или мета-локацией, здесь есть Railscast.

http://railscasts.com/episodes/251-metawhere-metasearch

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")

Другие вопросы по тегам