我有三种模式:
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
条记录,然后将每个VisitDetail
到Visit
条记录汇总。
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.
我的问题是,有更有效的方法吗?是否有一些我可以编写的查询在数据库中不会详尽无遗?
答案 0 :(得分:1)
您可以在表格之间使用joins
,并通过created_at
表格上的visit_details
字段有条件地进行选择。然后,您将获得查询返回的数组的大小:
Picture.joins(:visit => :visit_details).where('visit_details.created_at > ?', some_date)