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.
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' –
quelle version de rails utilisez-vous? –
4.0.3, rubis 2.0.0 –