私は、次のモデルていますのActiveRecord:範囲からの結果を注文しようとしてエラーが
class Master < ActiveRecord::Base
belongs_to :language
has_and_belongs_to_many :users
scope :with_users_count, -> do
joins('LEFT OUTER JOIN masters_users on masters_users.master_id = masters.id')
.select('masters.*, COUNT(masters_users.user_id) as users_count')
.group('masters.id')
end
end
私がやろうとしている:
Master.with_users_count.includes(:language).order('languages.name')
を次のエラーが起こる:
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "languages.id" must appear in the GROUP BY clause or be used in an aggregate function
スコープを変更する方法をアドバイスしてください。このエラーはfですixed?
編集(追加情報):
- 上記のコードは、結果に
quotes_count
「属性」を追加するためのものですので、私はN + 1ずに各マスターのためのユーザーの数を表示することができますし、カウンタキャッシュを必要とせずに(これはHABTMのためにバグが多いようです)。 - スコープは正常に機能しますが、
order
メソッドを呼び出すとエラーが表示されます。 - 並べ替えはRansackの宝石によって行われるので、どのように処理されるかは制御できません。私は
order
メソッドを、Ransacksort_link
でソートしようとしたときに起こるエラーを再現する方法として、より複雑な質問を避けるために使用しました。
ありがとうございます。
は、ということが正しい、あなただけのcolumnularデータと一緒に、各マスタのユーザー数のカウントを取得しようとしているように見えますか? – coreyward
coreyward:それは正しいです。各マスターのユーザー数を取得しようとするので、N + 1個のクエリを生成せずにインデックスビューを使用できます。追加情報を提供するために質問を編集しました。 – BrunoFacca
さて、あなたはあなたの「命令」を完全に取り除くことができる/できないと思います。あなたが関係として 'languages'を読み込もうとしているからです。 'masters'を関連する' languages.name'でソートしたい場合は、別のjoinを使う必要があります。 Arelを使用するように変換すると、ASTはモデルで既に定義したリレーションシップとテーブル名をよりよく管理できます。 – coreyward