Rails查询问题

时间:2011-05-12 17:57:07

标签: sql ruby-on-rails ruby-on-rails-3 postgresql

我的照片中有很多评论。

我想选择最近评论的照片,并在一个“时间轴”中显示这些照片,其中最近评论的照片位于顶部,其他照片位于下方。

我试过这个,它适用于SQLite:

@photos = Photo.select('DISTINCT photos.*').joins(:comments).order('comments.created_at DESC')

然而,在PostgreSQL上进行测试会引发此错误:

PGError: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
\n: SELECT DISTINCT photos.* FROM \"photos\" INNER JOIN \"comments\" ON \...

所以,问题是,我正在选择照片,但是通过评论的新近度排序......而且Postgre不喜欢这样。

任何人都可以建议:

答:我如何修复此查询...

B:根据评论的新近程度检索照片的另一种方法是什么?

我这样做而不是通过评论模式这样做的重要原因是我希望每张照片都显示一次,并且旁边有任何最近的评论,而不是每次显示每条评论,同时出现多次相同的照片。

谢谢!

2 个答案:

答案 0 :(得分:1)

查看belongs_to关联的:touch参数:

  

:触摸

     

如果为true,则关联对象将为   触摸(updated_at / on属性   设置为现在)当这个记录是   保存或销毁。如果你指定一个   符号,该属性将被更新   用当前时间而不是   updated_at / on attribute。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

因此,在您的评论模型中,您将拥有:

belongs_to :photo, :touch => :comments_updated_at

现在,为了创建包含最近更新评论的照片时间线,您需要做的就是:

Photo.order('comments_updated_at DESC').all 

请务必在照片模型中添加“comments_updated_at”日期时间字段。

有意义吗?

答案 1 :(得分:0)

仅针对此问题的未来读者,SQlite与Postgresql中 SQL 问题的真正答案是,在SQL"标准"中,每个选定的列都需要在GROUP BY中或是一个聚合函数。

https://www.techonthenet.com/sql/group_by.php(或者您想要查看的SQL参考资料)

您的SQLite查询使用SELECT *而不是特定列。在Postgresql(MySQL,Maria,可能是MSSQL Server)等大多数数据库上都会出现类似的错误。由于很多正当理由,它绝对是无效的SQL语法。

在幕后,我不知道SQlite做了什么 - 也许它将*扩展到字段并将它们添加到引擎盖下的GROUP BY?但它不是一个很好的SQL语句,它引发了错误。