挑战:
我需要在论坛中找到最受欢迎的讨论。
背景资料:
views
的属性,可存储多少个属性
用户查看讨论的次数。我的解决方案:
在Forum
模型中创建一个实例方法,循环每一个讨论,并查看每个讨论的视图数量:
def most_popular_discussion
record_view = 0
self.discussions.each do |d|
record_views = d.views if d.views > record_views
end
record_views
end
为什么我提出了一个问题:
我的解决方案似乎是灾难性的低效率,因为它在查询表中查询每个条目。随着数据库变得越来越大,这种方法会越来越慢。我不介意太多,但most_popular_discourse
方法也会被要求很多(在每个用户的个人资料页面上),并且会让事情变得缓慢。
那么如何找到表中最大的整数? 或(我认为这可能是更好的方式)我是否应该实际保存记录的观看次数,而不是每次都进行处理?
我的应用程序可能还有另一个名为statistics
的表,只有两列,name:string
和information:string
并使用它存储其他统计信息?
然后,每当有人观看讨论时,我都会像这样 :
def iterate_views(ip)
current_views = self.views + 1
self.views = current_views
record_views_statistic = Statistic.find_by(name: 'record_views')
record_views_statistic.update_attributes(information: current_views.to_s) if current_views > record_views_statistic.information
# I convert current_views to a string before saving because the statistics table's `information` column holds strings in order to keep the table open and miscellaneous.
end
您如何看待这种方法?两者都与数据库进行了相当的交互,但第二种方法不会与数据库中的数据量成比例地减慢。
答案 0 :(得分:1)
这种方法将为您提供最受欢迎的讨论,并且比您的两种解决方案简单得多。
def most_popular_discussion
self.discussions.order(views: :desc).first
end
要获得最多的观看次数,您可以使用most_popular_discussion.views
或使用以下功能:
def record_views
self.discussions.maximum(:views)
end
请注意,我已经找到了查找观看次数最多的观看次数和观看次数最多的方法,因为您的挑战表明您希望找到最受欢迎的讨论,但两种解决方案似乎都找到了记录编号论坛讨论中的观点。
至于您的解决方案,您的第二个解决方案似乎更接近于一个好的解决方案,但为什么不在views
模型中缓存最受欢迎的讨论Forum
计数?假设我们在record_views
表中添加了forums
列。
class Discussion < ActiveRecord::Base
belongs_to :forum
def iterate_views
self.views += 1
if self.forum.present? && self.views > self.forum.record_views
self.forum.record_views = self.views
end
end
end
然后,找到Forum
模型中最受欢迎的讨论(假设关系无关紧要):
def most_popular_discussion
self.discussions.where(views: self.record_views).first
end