2010-11-02 75 views
0

代码子查询与轨道finder_sql

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)' 

我得到这个错误。

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

是您在投掷错误前输出查询的开发日志?如果是这样,你可以把它粘贴在这里吗? – brycemcd 2010-11-02 15:28:11

+0

我已更新问题。在控制台上试用它。 – 2010-11-02 15:39:19

回答

1

看起来它试图将你的finder_sql重新解释为counter_sql并做了一件非常糟糕的工作。解决方案是可能编写自己的counter_sql。

1

我的ActiveRecord 3.2.12看到的问题是CollectionAssociation#custom_counter_sql,取代通过匹配针对此正则表达式的:finder_sql选项SELECT子句COUNT(...):

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

,从“匹配一切SELECT“直到子查询中最后出现的”FROM“,而不是第一个”FROM“。

最简单的修复方法是将自定义:counter_sql选项传递到has_many,如documented