2010-11-02 76 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