Получите количество показов за сегодня, вчера и за этот месяц, жемчужина импрессионизма
Я использую драгоценный камень под названием 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