У Rails есть полезные помощники времени для создания верхней и нижней границ для вашего запроса. (beginning_of_month
и end_of_month
в Time class)
Этот метод также правильно экранирован с вопросительными знаками вместо строковой интерполяции, который открыт для атак SQL-инъекций.
def total_churn(month)
companies = Company.where('created_at BETWEEN ? and ?',(Time.now - 1.month).beginning_of_month,(Time.now - 1.month).end_of_month)
companies.count
end
Я бы также сказал, что это будет работать только в течение последнего года. Если вы хотите иметь возможность запрашивать более ранние данные, вы можете либо добавить параметр года, либо просто передать дату, и позволить ему использовать это вместо Time.now
.
# with separate year and month params
def total_churn(month, year)
date = DateTime.parse("#{year}/#{month}/01")
companies = Company.where('created_at BETWEEN ? and ?',(date - 1.month).beginning_of_month,(date - 1.month).end_of_month)
companies.count
end
# with a random date input
def total_churn(date_in_month)
companies = Company.where('created_at BETWEEN ? and ?',(date_in_month - 1.month).beginning_of_month,(date_in_month - 1.month).end_of_month)
companies.count
end
так что вы хотите передать строку типа «Январь» или целое число, подобное 1? – jstim
Я могу пройти, что имеет смысл для динамического определения 1 месяц назад, а затем запросить postgres. Спасибо – AnApprentice
Метод не должен полагаться на текущий месяц. Но месяц основан на том, что передается методу. – AnApprentice