gpt4 book ai didi

ruby-on-rails - 在 Rails 3 中按虚拟属性排序

转载 作者:行者123 更新时间:2023-12-04 06:35:32 26 4
gpt4 key购买 nike

后台:我有一组可以投票的帖子。我想根据帖子的“投票分数”对帖子进行排序,该分数由以下等式确定:

( (@post.votes.count)/( (Time.now - @post.created_at) ** 1 ) )

我目前正在定义投票分数:

  def vote_score(x)
( (x.votes.count) / ( (Time.now - x.created_at) ** 1 ) )
end

并将它们排序为:
@posts = @posts.sort! { |a,b| vote_score((b) <=> vote_score((a) }

目标:这种方法对我的应用程序加载时间造成了巨大的损失。有没有更好、更有效的方法来完成这种排序?

最佳答案

如果您使用 MySQL,则可以使用查询完成整个操作:

SELECT   posts.id,
(COUNT(votes.id)/(TIME_TO_SEC(NOW()) - TIME_TO_SEC(posts.created_at))) as score
FROM posts INNER JOIN votes ON votes.post_id = posts.id
GROUP BY posts.id
ORDER BY score DESC

或者:
class Post
scope :with_score, select('posts.*')
.select('(COUNT(votes.id)/(TIME_TO_SEC(NOW()) - TIME_TO_SEC(posts.created_at))) as score')
.joins(:votes)
.group('posts.id')
.order('score DESC')
end

这将使您的整个查询:
@posts = Post.with_score.all

P.S:然后,您可以修改 Post 类以使用 score 的 SQL 版本(如果存在)。您还可以将 score 函数缓存在一个实例中,这样您就不必在每次询问帖子的分数时重新计算它:
class Post
def score
@score ||= self[:score] || (votes.count/(Time.now.utc - x.created_at.utc)
end
end

P.S:SQLLite3 等效项是:
strftime('%s','now') - strftime('%s',posts.created_at)

关于ruby-on-rails - 在 Rails 3 中按虚拟属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5292624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com