为何order()方法在PaperTrail版本关联中不生效?
解决PaperTrail关联版本排序不生效的问题
问题原因
从你的SQL日志能看到,通过模型关联查询versions时,PaperTrail默认给关联查询加上了ORDER BY "versions"."created_at" ASC, "versions"."id" ASC的排序规则。当你调用order()方法时,Rails是追加新的排序条件到原有规则后面,而不是替换。比如你执行order(created_at: :desc)时,最终的排序规则变成了created_at ASC, id ASC, created_at DESC,这会导致排序逻辑冲突,结果自然不会按你预期的倒序返回。
解决方案
用reorder()方法替代order(),reorder()会完全替换掉原有排序规则,而不是追加:
示例代码
# 按创建时间升序取第一条 Outcome.last.versions.reorder(created_at: :asc).limit(1).select(:id) # 对应SQL会变成: # SELECT "versions"."id" FROM "versions" WHERE ... ORDER BY "versions"."created_at" ASC LIMIT 1 # 按创建时间降序取第一条 Outcome.last.versions.reorder(created_at: :desc).limit(1).select(:id) # 对应SQL会变成: # SELECT "versions"."id" FROM "versions" WHERE ... ORDER BY "versions"."created_at" DESC LIMIT 1
补充说明
如果需要保留部分原有排序规则,也可以在reorder()里明确写出所有需要的排序条件,比如想先按created_at倒序,再按id倒序:
Outcome.last.versions.reorder(created_at: :desc, id: :desc).limit(1).select(:id)
内容的提问来源于stack exchange,提问作者digitalWestie
相关产品推荐
相关产品推荐

