1

モデルメソッドを使用して、次のような配列を構築しようとしています:

[['3/25/13', 2], ['3/26/13', 1], ['3/27/13', 2]]

ここで、日付は文字列で、その後の数字はcountテーブル/オブジェクトのものです。

現在、次のモデルメソッドがあります。

def self.weekly_count_array
  counts = count(group: "date(#{table_name}.created_at)", conditions: { created_at: 1.month.ago.to_date..Date.today }, order: "date(#{table_name}.created_at) DESC")
  (1.week.ago.to_date).upto(Date.today) do |x|
    counts[x.to_s] ||= 0
  end
  counts.sort
end

ただし、カウントは正確には返されません (すべての値がゼロです)。私がチェックアウトしたSOに関するいくつかの同様の質問があるようですが、それらを機能させることもできないようです。

(1)これが最善の方法であるかどうかを教えてください。(2)上記のコードで問題が発生している可能性がある場合は、ガイダンスを提供してください。ありがとう!

4

5 に答える 5

8

必要に応じて、これをテンプレートとして使用してください

def self.period_count_array(from = (Date.today-1.month).beginning_of_day,to = Date.today.end_of_day)
  where(created_at: from..to).group('date(created_at)').count
end

これにより、日付がキー、カウントが値のハッシュが返されます。(Rails 3.2.x)

于 2013-03-27T18:45:04.153 に答える
1

多分これはあなたがやろうとしていることですか?

class YourActiveRecordModel < ActiveRecord::Base

  def.self weekly_count_array
    records = self.select("COUNT(id) AS record_count, DATE(created_at) AS created")
      .group("DATE(created_at)")
      .where("created_at >= ?", 1.month.ago.to_date) 
      .where("created_at <= ?", Date.current)

    records.each do |x|
      puts x.record_count
      puts x.created # 2013-03-14

      # use I18n.localize(x.created, format: :your_format) 
      # where :your_format is defined in config/locales/en.yml (or other .yml)
    end        
  end
end
于 2013-03-27T18:39:41.873 に答える
1

@Aditya Sanghiによる素晴らしい回答。

正確な要件がある場合は、次を選択できます。

def self.weekly_count_array
  records = select('DATE(created_at) created_at, count(id) as id').group('created_at')
  1.week.ago.to_date.upto(Date.today).map do |d| 
    [d, records.where('DATE(created_at) = ?', d.to_date).first.try(:id) || 0]
  end 
end
于 2013-03-27T19:03:50.500 に答える
0

カウントを実行するためのプロセスは必要ありません。これに対してクエリを実行するだけです。

def self.weekly_count_array
    select("created_at, COUNT(created_at) AS count")
    where(created_at: 1.month.ago.to_date..Date.today)
    group("created_at")
    order("created_at DESC")
end
于 2013-03-27T18:09:49.033 に答える