0

コマーシャルウィーク別のコール数を取得しようとしています。私はSQLを書いた:

select strftime('%W', date_time_origination) as week, count(*)
from calls
group by week;

次に、最初にこれを使用して、これをレールで実行しようとしました:

calls_by_week = Call.select("strftime('%W',date_time_origination) as week, count(*) as total_number_of_calls").group("week")

これにより、正しいデータを持つオブジェクトのコレクションが返されましたが、複数回繰り返されました (json 表現):

[{ "total_number_of_calls": 5435, "week": 39 },.....]

1 つのオブジェクトが返されるはずだったので、Rails クエリ構造を変更してみました。

calls_by_week = Call.select("strftime('%W', date_time_origination) as week").group("strftime('%W', date_time_origination)").count

今回は、クエリは 1 つのハッシュから、名前付きパラメーターを除いたものを返しました。

{ "31": 3123, "32": 1231,... }

次のように、jsonでデータを表示したいと思います。

{ "week": 31, "total_number_of_calls": 12412,.....}

最初のクエリによって生成された重複を排除する方法はありますか?

4

1 に答える 1

0

まず、Call.select(...)レールを使用すると、Callオブジェクトをインスタンス化しようとします。必要なのはCallオブジェクトではなく、ハッシュだけです。Call.connection.execute("SELECT .... blah blah").to_enum.to_a結果の配列の配列を使用して使用できます。

ただし、結果をハッシュ形式に変換するには、次を使用します

returned_hash = { "31": 3123, "32": 1231,... }
what_you_want = returned_hash.collect do |k,v|
  {"week" => k.to_i, "total_number_of_calls" => v.to_i}
end

もう 1 つの方法は.uniq、クエリに適用して使用することCallです。オブジェクトは作成されますが、少なくともデータが繰り返されることはありません。

于 2012-10-01T13:32:12.323 に答える