我有Articles
那个 have_many Metrics
。当 Metric.name = "score" 时,我希望Articles
按特定的 Metric.value 排序。(Metric
将各种文章统计信息记录为“名称”和“价值”对。一篇文章可以有多个指标,甚至多个“分数”,尽管我只对按最新排序感兴趣。)
class Article
has_many :metrics
class Metric
# name :string(255)
# value :decimal(, )
belongs_to :article
我正在努力写一个范围来做到这一点 - 有什么想法吗?像这样的东西?
scope :highest_score, joins(:metrics).order('metrics.value DESC')
.where('metrics.name = "score"')
更新:
一篇文章可能在
metrics
表中存储了许多“分数”(因为它们是每周/每月/每年计算的等),但我只对使用任何一篇文章的第一个(最近)“分数”感兴趣。该Metric
模型具有确保 DESCending 排序的 default_scope。修复了“metrics.value DESC”报价位置的拼写错误。
与我的电话朋友 uber rails 黑客交谈,看起来我可能需要一个原始 SQL 查询。现在我有点不知所措了......(如果有帮助,我正在使用 Postgres。)
谢谢!
更新 2:
多亏了 Erwin 出色的 SQL 查询建议,我有了一个可以使用的原始 SQL 查询:
SELECT a.*
FROM articles a
LEFT JOIN (
SELECT DISTINCT ON (article_id)
article_id, value
FROM metrics m
WHERE name = 'score'
ORDER BY article_id, date_created DESC
) m ON m.article_id = a.id
ORDER BY m.value DESC;
article_list_by_desc_score = ActiveRecord::Base.connection.execute(sql)
它给出了一个表示文章数据的哈希数组(但不是文章对象??)。
后续问题:
有什么方法可以将其转换回 Rails 的 activerecord 查询?(所以我可以在范围内使用它)
解决方案更新:
万一有人正在寻找最终的 ActiveRecord 查询 - 非常感谢在这个问题上帮助我的 Mattherick 。最终的工作查询是:
scope :highest_score, joins(:metrics).where("metrics.name"
=> "score").order("metrics.value desc").group("metrics.article_id",
"articles.id", "metrics.value", "metrics.date_created")
.order("metrics.date_created desc")
感谢大家!