我有照片have_many评论。
我想选择任何有最近评论的照片,并在一种"时间线"中显示这些照片,其中最近评论的照片在顶部,其他照片在下面。
我试过这个,它在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: 通过评论的新近度检索照片的不同方法?
我这样做而不是通过评论模型这样做的重要原因是我想显示每张照片一次,旁边有任何最近的评论,而不是单独显示每条评论,同时多次出现相同的照片。
谢谢!
查看belongs_to关联的 :touch 参数:
:触摸
如果为 true,则关联的对象将是 已触摸(updated_at/打开属性 设置为现在)当此记录为 保存或销毁。如果指定 符号,该属性将被更新 使用当前时间而不是 updated_at/打开属性。
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"日期时间字段添加到您的照片模型即可。
有意义?
对于这个问题的未来读者,在 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语句,它抛出了错误。