Получите количество показов за сегодня, вчера и за этот месяц, жемчужина импрессионизма

Я использую драгоценный камень под названием impressionist регистрировать просмотры страниц на шоу-акции.

Everythink работает просто замечательно. Я могу получить количество всех просмотров страниц с:

@advertisement.impression_count

Но теперь я хочу иметь возможность фильтровать просмотры страниц за сегодня, вчера и за этот месяц.

До сих пор я придумал это решение.

 @today  =  Impression.where( :conditions => { :created_at => Date.today...Date.today+1 }, :impresionable_id =>@advertisement.id)

Там нет ошибок.

Тогда ввиду:

<%= "#{@today} views so far!" %>

дает мне #<Impression::ActiveRecord_Relation:0x000000068d46f8>

Затем я попытался добавить, как: <%= "#{@today.impression_count} views so far!" %> дает мне это:

undefined method `impression_count'

тогда я попробовал просто:<%= "#{@today.count} views so far!" %> и еще ошибка:

Mysql2::Error: Unknown column 'conditions.created_at' in 'where clause': SELECT COUNT(*) FROM `impressions`  WHERE (`conditions`.`created_at` >= '2014-12-18' AND `conditions`.`created_at` < '2014-12-19') AND `impressions`.`impresionable_id` = 127

Есть идеи?

Заранее спасибо!

4 ответа

Решение

Нет необходимости в хэше условий.

today = Date.today
range = today..today.next_day
@imp = Impression.where(created_at: range, impressionable_id: @advertisement.id)

И если @advertisement могут быть впечатления, тогда лучше было бы следующее:

@imp = @advertisement.impressions.where(created_at: range)

Затем, чтобы получить счет, вы должны:

@today = @imp.count

Также, к вашему сведению, вам может понадобиться DateTime.now вместо Date.today потому что вы сравниваете с полем даты и времени, т.е.

Добавьте области действия в impression.rb

scope :today, -> {where("created_at >= ? AND created_at < ?", Time.now.beginning_of_day, Time.now.end_of_day)}
scope :yesterday, -> {where("created_at >= ? AND created_at < ?", 1.day.ago.beginning_of_day, 1.day.ago.end_of_day)}
scope :this_month, -> {where("created_at >= ? AND created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)}

в контроллере:

 @today = Impression.today.where(impresionable_id: @advertisement.id)
 @yesterday = Impression.yesterday.where(impresionable_id: @advertisement.id)
 @this_month = Impression.this_month.where(impresionable_id: @advertisement.id)

И вы можете использовать эти области в любом месте, где вам нужно отфильтровать Impressions по дате сегодня, вчера или в этом месяце. Это лучше по сравнению с написанием where пункт везде.

@today = Impression.where( :conditions => { :created_at => Date.today...Date.today+1 }, :impresionable_id =>@advertisement.id)

возвращает #<Impression::ActiveRecord_Relation:0x000000068d46f8>,

Попробуй это:

@today = Impression.where(created_at: Date.today...Date.today+1, impresionable_id: @advertisement.id).count

Это было проще, чем я, хотя

В рекламе.рб

 has_many :impressions, :as=>:impressionable


     def view_count_yesterday
       impressions.where("created_at >= ? AND created_at < ?",                 1.day.ago.beginning_of_day, 1.day.ago.end_of_day).size

     end

      def view_count_today
        impressions.where("created_at >= ? AND created_at < ?", Time.now.beginning_of_day, Time.now.end_of_day).size
               # impressionist_count(:start_date => 1.day.ago)
     end
Другие вопросы по тегам