通过关联的属性值对集合进行排序的数据库查询

时间:2013-08-21 17:56:01

标签: ruby-on-rails activerecord associations

我想基于关联对象的属性将:order过滤器应用于db查询。

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")

它不起作用。它只是按特定顺序返回关键字集合。

1 个答案:

答案 0 :(得分: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非常相似,我不知道如何不进行搜索。