1

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回限りのソリューションがあります。しかし、私は一般的なものを探しているので、繰り返し続ける必要はありません。

4

1 に答える 1

0
@person.organizations.reorder('').empty? 

動作するはずです

于 2016-01-16T02:26:59.913 に答える