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