3

私は Active Record クエリ インターフェイスを理解しようとしています。私は2つのモデルを持っています:

class Movie < ActiveRecord::Base
  has_many :datapoints
  attr_accessible :genre
end

class Datapoint < ActiveRecord::Base  
  belongs_to :movie  
  attr_accessible :cumulative_downloads, :timestamp
end

特定の期間におけるジャンルごとの増分ダウンロードを見つけたいと考えています。

これまでのところ、次のように、期間内に映画ごとに最大および最小のダウンロードを取得することができました。

maximums = Datapoint.joins(:movie)
    .where(["datapoints.timestamp > ?", Date.today - @timespan])
    .group('datatpoints.movie_id')
    .maximum(:cumulative_downloads)

これにより、これをジャンルごとの増分に集計する前に、映画ごとの増分を計算できます。

明らかに、これは少し不器用であり、これを 1 つのステップで (そしてハッシュ条件を使用して) 実行できると確信しています。私はどうやって頭をつかむことができません。手伝ってくれますか?

とても有難い!

デレク。

4

1 に答える 1

3

これにより、ジャンルごとの最大値を計算できると思います。

Movie.joins(:datapoints).where(datapoints: {timestamp: (Time.now)..(Time.now+1.year)}).group(:genre).maximum(:cumulative_downloads)

編集 1

いくつかの手順で差分を取得できます。

rel = Movie.joins(:datapoints).where(datapoints: {timestamp: (Time.now)..(Time.now+1.year)}).group(:genre)
mins = rel.minimum(:cumulative_downloads)
maxs = rel.maximum(:cumulative_downloads)
res = {}
maxs.each{|k,v| res[k] = v-mins[k]}

編集 2

あなたの最初の方向性はほぼそこにありました。SQL でムービーごとの差分を計算し、データをステージングして、1 回のパスで収集できるようにするだけです。SQLですべてを行う方法があると確信していますが、それが簡単かどうかはわかりません.

# get the genre and diff per movie
result = Movie.select('movies.genre, MAX(datapoints.cumulative_downloads)-MIN(datapoints.cumulative_downloads) as diff').joins(:datapoints).group(:movie_id) 
# sum the diffs per genre
per_genre = Hash.new(0)
result.each{|m| per_genre[m.genre] += m.diff}

編集 3

選択に movie_id を含め、グループにジャンルを含めます。

# get the genre and diff per movie
result = Movie
    .select('movies.movie_id, movies.genre, MAX(datapoints.cumulative_downloads)-MIN(datapoints.cumulative_downloads) as diff')
    .joins(:datapoints)
    .group('movies.movie_id, movies.genre') 
# sum the diffs per genre
per_genre = Hash.new(0)
result.each{|m| per_genre[m.genre] += m.diff}
于 2012-07-08T18:27:17.623 に答える