Ruby on rails 优化RubyonRails(计数)
如何优化此代码?( (许多信息) 谢谢你试试这个Ruby on rails 优化RubyonRails(计数),ruby-on-rails,ruby,performance,counter,Ruby On Rails,Ruby,Performance,Counter,如何优化此代码?( (许多信息) 谢谢你试试这个 def messages_count total = users.inject(0) {|result,user| result + user.messages.size} end 在您的情况下,最终您将计算所有消息。因此您可以使用 Message.count 因为我假设有一个与相关的模式用户有很多:消息消息模式。 users=User.created\u在(3天之前)之后创建 可以在单行查询中使用 Message.where("user
def messages_count
total = users.inject(0) {|result,user| result + user.messages.size}
end
在您的情况下,最终您将计算所有消息。因此您可以使用
Message.count
因为我假设有一个与
相关的模式用户
有很多:消息
消息
模式。
users=User.created\u在(3天之前)之后创建
可以在单行查询中使用
Message.where("user_id IN (?)",users.pluck(:id)).count
或
您也可以将其编写为:
def messages_count
users.sum { |u| u.messages.size }
end
使用。问题是不明确的。最简单的答案是Message.all.count
yes@GregDan是正确的哈,Message.all.count
是错误的,因为users
有消息,admin
有消息,但是thx@ArupRakshit@BorisBresciani:counter_缓存和消息。count
是两个截然不同的东西。counter_缓存是这里最好的解决方案。如何对其进行更优化(注入)?此外,您的假设(“您正在计算所有消息”)没有任何依据。在注入的情况下,我们只对数组进行一次迭代,而没有在迭代器中进行任何硬计算。“我们只对一个数组进行一次迭代,而没有在迭代器中进行任何困难的计算”-原始代码也是如此。@SergioTulentsev它在代码更少的意义上更“优化”:)您假设users
代表所有用户。这不一定是真的。据我们所知,它可以是users=User.created\u之后(3天之前)
或其他什么当然,是的用户将包含您希望从db获得的用户,并且可以触发查询,不用担心……在这种情况下,消息。all.count
是一个错误的解决方案。可以只是消息。count
,顺便说一句。是的,您是对的,但我提到了消息的任何情况。where(user:users).count
应为等效值。
Message.where(user: users).count
def messages_count
users.sum { |u| u.messages.size }
end