2010-11-02 2 views
0

codeavec sous-requête finder_sql dans des rails

has_many :open_invoices, :class_name => "ArInvHeader", 
:finder_sql => 'SELECT ar_inv_headers.* FROM ar_inv_headers WHERE customer_id = #{id} and 
orig_amt = (select sum(amount) from ar_inv_actions,ar_inv_headers where ar_inv_actions.ar_inv_header_id = ar_inv_headers.id)' 

Je reçois cette erreur.

ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to y 
our MySQL server version for the right syntax to use near ')' at line 1: SELECT COUNT(*) FROM ar_inv_actions,ar_inv_header 
s where ar_inv_actions.ar_inv_header_id = ar_inv_headers.id) 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract_adapter.rb:2 
27:in `log' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/mysql_adapter.rb:324: 
in `execute' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/mysql_adapter.rb:639: 
in `select' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/database_sta 
tements.rb:7:in `select_all_without_query_cache' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/query_cache. 
rb:62:in `select_all' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/database_sta 
tements.rb:13:in `select_one' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/database_sta 
tements.rb:19:in `select_value' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/base.rb:920:in `count_by_sql' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/has_many_association.rb:34:i 
n `count_records' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/association_collection.rb:27 
7:in `size' 
    from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/association_collection.rb:29 
6:in `empty?' 
    from (irb):9 
+0

est votre journal de développement sortie de la requête avant de lancer l'erreur? Si oui, pouvez-vous le coller ici? – brycemcd

+0

J'ai une question mise à jour. Essayer sur la console. –

Répondre

1

On dirait qu'il essaie de réinterpréter votre finder_sql en counter_sql et faire un très mauvais travail de celui-ci. La solution est probablement d'écrire votre propre counter_sql qui fonctionne.

1

La question que je vois dans ActiveRecord 3.2.12 est CollectionAssociation#custom_counter_sql, qui remplace la clause SELECT avec COUNT (...) en faisant correspondre l'option :finder_sql contre cette regex:

/SELECT\b(\/\*.*?\*\/)?(.*)\bFROM\b/im 

qui correspond tout de " SELECT "jusqu'à la dernière occurrence de" FROM "dans la sous-requête, pas la première" FROM "comme vous le souhaitez.

La solution la plus simple consiste à transmettre une option personnalisée :counter_sql en has_many, sous la forme documented.

Questions connexes