Person モデルに組織があるかどうかを確認したい場合があります。簡単です。使用して@person.organizations.empty?
ください。ただし、default_scope ( default_scope { order(:name) }
) と組み合わせると、次のエラーが発生します。
ActiveRecord::StatementInvalid (PG::InvalidColumnReference: エラー: SELECT DISTINCT の場合、ORDER BY 式は選択リストに表示する必要があります LINE 1: ... WHERE "relationships"."person_id" = $1 ORDER BY "organizat... ^
: SELECT DISTINCT 1 AS one FROM "organizations" INNER JOIN "contracts" ON "organizations"."id" = "contracts"."organization_id" INNER JOIN "relationships" ON "contracts"."id" = "relationships"." contract_id" WHERE "relationships"."person_id" = $1 ORDER BY "organizations"."name" ASC LIMIT 1):
私は Postgres DB を使用しており、(簡略化された) モデルのセットアップは次のようになります。
class Organization < ActiveRecord::Base
has_many :contracts
has_many :people, -> { uniq }, :through => :contracts
default_scope { order(:name) }
end
class Person < ActiveRecord::Base
has_many :relationships, :inverse_of => :person
has_many :contracts, :through => :relationships
has_many :organizations, -> { uniq }, :through => :contracts
end
class Contract < ActiveRecord::Base
belongs_to :organization, touch: true
has_many :relationships, :inverse_of => :contract
has_many :people, :through => :relationships
end
私がこれまでに試したこと:
has_many :organizations, -> { order(:name).uniq }, :through => :contracts
これはおそらく、アクティブレコードに事前に何が来るかを確認させます(そうではありませんでした)そして
has_many :organizations, -> { includes(:name).uniq }, :through => :contracts
コンソールに手動で配置すると問題は解決しますが、アプリ自体には役立ちません。を使用しているときに、 ActiveRecordにempty?
クエリを別の形式に強制したり、順序を削除させたりする方法empty?
編集:明確にするために、使用が機能することを完全に認識しており@person.organizations.count == 0
、おそらく他の1回限りのソリューションがあります。しかし、私は一般的なものを探しているので、繰り返し続ける必要はありません。