0

我做了一件可怕的事...

我有一个包含帐户余额的表。它具有 account_id、金额和 month_end 日期的属性。我想在该表中查询过去十二个月的余额。但一定有比这更好的方法。

scope :recent_balances, lambda { { :conditions => 
  ["month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ? OR month_end = ?", 
  last_month_end.to_s, 
  (last_month_end-1.month).end_of_month.to_s,
  (last_month_end-2.month).end_of_month.to_s,
  (last_month_end-3.month).end_of_month.to_s,
  (last_month_end-4.month).end_of_month.to_s,
  (last_month_end-5.month).end_of_month.to_s,
  (last_month_end-6.month).end_of_month.to_s,
  (last_month_end-7.month).end_of_month.to_s,
  (last_month_end-8.month).end_of_month.to_s,
  (last_month_end-9.month).end_of_month.to_s,
  (last_month_end-10.month).end_of_month.to_s,
  (last_month_end-11.month).end_of_month.to_s ] } }

private

def self.last_month_end
  last_month_end ||= (Date.today - 1.month).end_of_month
end

我的问题是:

  1. 执行此查询的聪明方法是什么?(这不可能是我刚刚想出的。)
  2. 如何修改此查询以使其更灵活?我希望能够将特定月数传递给查询(例如查询六个月的余额或 24 个月的余额)
4

1 回答 1

1
months = (1..11).map { |m| last_month_end.advance(months: 0 - m) }

where("month_end IN (?)", months)

或类似的东西。这将是一种更具可读性和可维护性的方式来执行您在上面所做的事情。正如其他人所说,您可以检查日期是否在 SQL 中的开始日期和结束日期之间。

where("date >= ? AND date <= ?", start_date, end_date)

或(更好)

where("date BETWEEN ? AND ?", start_date, end_date)
于 2013-07-21T07:28:00.353 回答