has_many関係を持つ親のモデルを子のモデルに基づいてソートする方法
Company
と Disclosure
というモデルが有り Company
class Company < ActiveRecord::Base
has_many :disclosures, dependent: :destroy
end
の関係になっています。
ここでDisclosure
はpublished_at
というdatetime
のカラムを持つのですが、複数のCompany
をDisclosure
のpublished_at
カラムの最新の物を用いてソートするにはどのような方法があるでしょうか?
現在はCompany
にlatest_disclosure_published_at
というソート用のカラムを追加し、Disclosure
の更新時にCompany
側の情報を更新しています。
Company
にカラムを追加せずにこのようなソートをするもっと良い方法はありますか?
追記
@yasu さんに教えて頂いた方法でローカルではできたのですが、サーバー上で試してみた所エラーが出てしまいました。
PG::GroupingError: ERROR: column "companies.code" must appear in the GROUP BY clause or be used in an aggregate function`
サーバー上とローカルでPostgres
のバージョンが異なってしまっているのですが、それが原因なのでしょうか…?
Company.joins(:disclosures).
group('companies.id, companies.code').
select('companies.id, companies.code, MAX(disclosures.published_at) disclosure_published_at')
のようにselect
するカラムを全てgroup
で指定すれば呼び出せるようですが、できれば*
で一括で指定したいです。
サーバー上(
psql --version
psql (PostgreSQL) 8.4.20
psql --version
psql (PostgreSQL) 9.5.2