【问题标题】:DB query that orders a collection by an association's attribute value按关联的属性值对集合进行排序的数据库查询
【发布时间】:2013-08-21 17:56:00
【问题描述】:

我想根据关联对象的属性将:order 过滤器应用于数据库查询。

class Report < ActiveRecord::Base
  has_many :keywords 
end

class Keyword < ActiveRecord::Base
  has_one :score
  belongs_to :report 
end

class Score < ActiveRecord::Base
  belongs_to :keyword 
end

这是我的查询,用于提取报告的关键字,按关键字的相关得分值属性排序。

@keywords = @report.keywords.all(:joins => :score, :order => "scores.value DESC")

它不工作。它只是以没有特定顺序的方式返回关键字集合。

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    那是因为您的查询正在做两件不同的事情。它根据报告 ID (@report.keywords) 从一份报告中获取所有关键字。然后,您正在尝试使用关键字和分数进行连接。
    想想 SQL,您想要的是将报表连接到其他两个表。

    SELECT * FROM reports 
    JOIN keywords ON reports.id = keywords.id 
    JOIN scores ON keywords.id = scores.id
    

    要将其转换为 Rails,如果您使用的是它的更新版本,您可以执行以下操作:

    @report.keywords.includes(:score).order("scores.value DESC")
    

    老版本的rails很相似,不搜索不知道怎么弄。

    【讨论】:

    • 这对我有用@report.keywords.includes(:score).order("scores.value DESC")
    • 太好了。只需比较生成的 2 个查询即可查看差异。 =]
    • 你的对我不起作用。它给了我一个错误,说Report 没有包含方法。如果你改变你对我所说的对我有用的答案,我会标记它是正确的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2023-03-28
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多