我试图编写一个ActiveRecord查找查询,但没有成功。请帮帮我!
我的项目的这个特性是一个类似Digg的博客:每个注册用户都可以添加一个明星到博客帖子本身或它的任何回复。
下面是相关的模型类:
因此,我要做的是在blog_post.rb中编写一个方法,它将返回BlogPost对象以及它的所有应答类的星环总数。也就是说,如果一个博客帖子有10颗星星,并且有两个回复,每个回复有5颗星星,那么它应该返回20颗。
如何编写这个查询,而不需要进行大量的数据库事务处理?
发布于 2009-02-11 00:09:30
我建议用SQL来完成它。你可以用几种方法。你在使用MYSQL吗?如果您想处理两个查询,然后将这些数字相加在一起,您可以在SQL中执行如下操作:
select count(starrings.id) from starrings where starrable_type='BlogPost' and starrable_id=#{blogpost.id}
和
select count(starrings.id) from starrings join replies on starrings.starrable_type='Reply' and starrable_id=replies.id and replies.blog_post_id=#{blogpost.id}
注意:我没有测试这个SQL,可能是拼错了什么,或者打错了错误。
您可以使用“Starring.count_by_sql(您的SQL在这里)”运行sql计数,然后将这两个数字相加在一起。您可能可以通过联合将其简化为1条SQL语句,但我不会费心。
发布于 2009-02-10 23:27:21
假设您在BlogPost和Reply上都有一个多态方法BlogPost,它为每个Starring对象返回Starring对象(您可能没有,但我认为您应该这样做),那么在blog_post.rb中您可以这样做:
def total_number_of_stars
stars.size + replies.inject(0) { |s,v| s.stars.size += v.stars.size }
end诚然,这将在幕后执行相当多的查询,但这就是Rails的工作方式。如果它的性能不够好,您可以将find_by_sql与定制的SQL结合使用。
https://stackoverflow.com/questions/534658
复制相似问题