3

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

動いていない。特定の順序でキーワードのコレクションを返すだけです。

4

1 に答える 1

1

これは、クエリが 2 つの異なることを行っているためです。レポート ID ( ) に基づいて、1 つのレポートからすべてのキーワードを取得しています@report.keywords。次に、キーワードとスコアを結合しようとしています。
SQL について考えてみてください。必要なのは、レポートから他の 2 つのテーブルへの結合です。

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

これをレールに変換するには、更新されたバージョンを使用している場合、次のようにすることができます。

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

古いバージョンのレールは非常に似ています。検索せずに行う方法がわかりません。

于 2013-08-21T18:07:58.693 に答える