根据相关记录计数选择记录

时间:2013-09-13 17:05:53

标签: sql ruby-on-rails ruby-on-rails-3 postgresql rails-activerecord

我有三种模式:

class Picture < ActiveRecord::Base
  # fields: url

  has_one :visit
end

class Visit < ActiveRecord::Base
  # fields: total_visits
  belongs_to :picture
end

class VisitDetail < ActiveRecord::Base
  #fields: ip_address
  has_many :visits
end

我想编写一个查询,根据时间范围选择所有视图最多的图片。例如,我想检索上周查看过的所有热门图片。目前,我正在循环查看上周,月份等创建的所有VisitDetail条记录,然后将每个VisitDetailVisit条记录汇总。

hash = { }

VisitDetail.where("created_at >= ?").each do |record|
  if record.visit
     if hash.key? record.visit.picture_id
       hash[record.visit.picture_id] += 1
     else
       hash[record.visit.picture_id] = 1
     end
  end
end

# With my hash, I then order the hash appropriately and query
# for the pictures based on the key values in the hash which
# represent individual picture ids.

我的问题是,有更有效的方法吗?是否有一些我可以编写的查询在数据库中不会详尽无遗?

1 个答案:

答案 0 :(得分:1)

您可以在表格之间使用joins,并通过created_at表格上的visit_details字段有条件地进行选择。然后,您将获得查询返回的数组的大小:

Picture.joins(:visit => :visit_details).where('visit_details.created_at > ?', some_date)