在控制器中,我有一个带有子选择的activequery来获取计数,并希望使用计数来进一步限制返回的行数。例如,comments = 0
我正在使用,因为这是我在mysql提示符下测试它的唯一方法。检查where子句中的聚合函数不起作用。
有什么想法吗?
最终,我的目标是将其调整为destroy语句以删除符合该条件的值,但我甚至不知道如何做到这一点。所以这意味着只删除hbookmarks表中的行(而不是书签表)。
来自控制器的代码:
Hbookmark.joins("INNER JOIN bookmarks ON hbookmarks.bookmark_id = bookmarks.id")
.select("bookmarks.short_name, hbookmarks.id, ( select count(*) from clickcomments where clickcomments.click_id = hbookmarks.id ) as comments")
.where("bookmarks.user_id = ? AND hbookmarks.create_date < DATE_SUB(NOW(), INTERVAL 1 YEAR )", current_user.id)
.having("comments = 0")
.order("hbookmarks.create_date desc")
答案 0 :(得分:0)
之前我遇到过类似的问题,我通过将comments
替换为您用来定义它的实际SQL段来解决它:
having("( select count(*) from clickcomments where clickcomments.click_id = hbookmarks.id ) = 0")
答案 1 :(得分:0)
最终它在ActiveRecord上的size命令失败了,我在logger语句中有这个命令。
logger.info("purge size with no comments: " + @topurge.size.to_s)
使用.length不会导致错误,其余查询工作正常。一旦完成,我就注释掉了.length。
正确的方法是:
logger.info("purge size with no comments: " + @topurge.length.to_s)
关于我的另一个问题,如何在ActiveRecord上执行删除,直接转发,destroy_all。现在我的数据库有一些用户拥有1000行,所以在这种情况下,我进入了mysql并进行了快速执行的手术删除,而这种活动记录很慢。有人对Rails内部删除的性能方式有更好,更快,更少的影响,请告诉我。
# remove the old clicks that do not have comments - we'll keep those for search look up
@topurge.destroy_all