鑑於以下兩個(簡體)型號:finder_sql爲的has_many關係
class Customer < ActiveRecord::Base
# finder sql to include global users in the association
has_many :users, :dependent => :destroy,
:finder_sql => 'SELECT `u`.* FROM `users` `u`
WHERE (`u`.`customer_id` = "#{id}" OR `u`.`customer_id` IS NULL)'
validates_presence_of :name
end
class User < ActiveRecord::Base
# most users belong to a customer.
# however, the customer_id may be NULL
# to implement the concept of "global" users.
belongs_to :customer
validates_presence_of :email
end
起初,這似乎只是很好地工作:
>> Customer.first.users # => Array of users including global users
但是當我嘗試下我得到一個MySQL錯誤:
>> Customer.first.users.find_by_email("[email protected]")
ActiveRecord::StatementInvalid: Mysql::Error: Operand should contain 1 column(s):
SELECT * FROM `users`
WHERE (`users`.`email` = '[email protected]') AND
(
SELECT `u`.* FROM `users` `u`
WHERE (`u`.`customer_id` = "1" OR `u`.`customer_id` IS NULL)
ORDER BY u.nickname
) LIMIT 1
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:188:in `log'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:309:in `execute'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:563:in `select'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:635:in `find_by_sql'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1490:in `find_every'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1452:in `find_initial'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:587:in `find'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1812:in `find_by_email'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1800:in `send'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1800:in `method_missing'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_collection.rb:370:in `send'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_collection.rb:370:in `method_missing'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:2003:in `with_scope'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:202:in `send'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:202:in `with_scope'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_collection.rb:366:in `method_missing'
因此,Rails正在生成無效的SQL語句。原因可能是我的finder_sql,因爲沒有finder_sql的關聯按預期工作。
我已經嘗試刪除所有可選插件(will_paginate)。我試圖實現的事情其實很簡單:在我的關聯中包含與以下條件(users.customer_id = 1 OR users.customer_id IS NULL)
匹配的所有用戶模型。
感謝任何幫助!