0

モデルにスコープを追加しようとしています。データベースから合計再生数を計算しようとしています。私はRails 3.2.13を使用しています

MYSQL クエリは、期待される結果を提供します。

SELECT COUNT(DISTINCT(CONCAT(stats.filename,stats.viewer_id)))
FROM `stats` 
WHERE `stats`.`user_id` = 4 
AND (stats.cf_status in ('Hit', 'Miss', 'RefreshHit', 'Error')) 
AND (date_time between '2013-04-14 05:00:00' and '2013-04-21 16:35:16')

= 169プレイ

このスコープを機能させようとしていますが、ログを確認するとRailsはそれを無視しています。

統計モデル

scope :only_valid, -> {
where("stats.cf_status in ('Hit', 'Miss', 'RefreshHit', 'Error')")
}
scope :totviews, -> {
where(" COUNT(DISTINCT(CONCAT(stats.filename,stats.viewer_id)))")
}

ダッシュボード コントローラー の total_views: Stat.for_user(current_user).only_valid. between(@start_at,@end_at).totviews.count,

ログからの出力に は、変更されたものではなく、元のクエリが引き続き表示されます。

SELECT COUNT(*) 
FROM `stats` 
WHERE `stats`.`user_id` = 4 
AND (stats.cf_status in ('Hit', 'Miss', 'RefreshHit', 'Error')) 
AND (date_time between '2013-04-14 05:00:00' and '2013-04-21 17:17:29')

= 4589 プレイ

どんな助けでも大歓迎です。ありがとう

expose(:overview_chart_views) {
{
total_views:    to_col(Stat.for_user(current_user).only_valid.between(@start_at, @end_at).by_day),
total_viewers:  to_col(Stat.unique_plays.for_user(current_user).only_valid.between(@start_at, @end_at).by_day),
new_viewers:    to_col(Viewer.for_user(current_user).with_first_views.only_valid.between(@start_at, @end_at).by_day),
return_viewers: to_col(Viewer.for_user(current_user).without_first_views.only_valid.between(@start_at, @end_at).by_day)
}

private

def to_col(results)
lookup = {}
results.each {|row|
if !row['date'].kind_of?(Date)
row['date'] = Date.parse(row['date']);
end
lookup[row['date']] = row['result'].to_i }
(@start_at.to_date..@end_at.to_date).to_a.map {|date| lookup[date] || 0}
end
end
4

1 に答える 1

0

関数で要素をフィルタリングしているため、totviewsスコープは無効です。count

それを削除して、クエリを次のように変更してみてください。

class Stat < ActiveRecord::Base
  def self.total_views
    Stat.for_user(current_user).only_valid.between(@start_at,@end_at).count('DISTINCT(CONCAT(stats.filename,stats.viewer_id))')
  end
end
于 2013-04-22T18:26:20.937 に答える