2016-01-16 2 views
1

Parfois, je veux vérifier si un modèle de personne a des organisations. Assez simple; utiliser @person.organizations.empty?. Cependant, couplé avec mon default_scope (default_scope { order(:name) }), je reçois cette erreur:Vide? échoue sur ActiveRecord avec un default_scope (: order)

ActiveRecord::StatementInvalid (PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 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):

J'utilise une configuration de modèle Postgres DB et mon (en abrégé) se présente comme suit:

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 

choses que je essayé jusqu'à présent:

has_many :organizations, -> { order(:name).uniq }, :through => :contracts 

ce qui serait soi-disant faire voir activerecord ce qui allait arriver à l'avance (il n'a pas) et

has_many :organizations, -> { includes(:name).uniq }, :through => :contracts 

qui résout le problème lorsque je le mets manuellement dans la console, mais n'aide pas dans l'application elle-même. Comment puis-je contraindre ActiveRecord à formater la requête empty? différemment ou en abandonnant la commande chaque fois que j'utilise empty??

EDIT: Pour être clair, je suis parfaitement conscient que l'utilisation de @person.organizations.count == 0 fonctionnera, et il existe probablement d'autres solutions uniques. Mais je cherche un général pour que je ne doive pas me répéter.

Répondre

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

devrait fonctionner

+0

Je suis à la recherche d'une solution qui fera cette utilisable en général; cette base de code est assez fracturée sans avoir à mettre des panneaux de signalisation pour dire 'si vous voulez vérifier cela pour le vide, utilisez count == 0 ou réorganisez' –

+0

quelle version de rails utilisez-vous? –

+0

4.0.3, rubis 2.0.0 –