これはRails 3のバグだと思います。ここの誰かが私を正しい方向に導いてくれることを願っています。以下に掲載されているコードは、この問題を説明するためのものです。これで問題が混乱しないことを願っています。
Post モデルと Comment モデルがあるとします。投稿には has_many のコメントがあり、コメントは投稿に属しています。
Post モデルに default_scope を設定し、joins() と where() の関係を定義します。この場合、where() は joins() に依存しています。
通常、投稿はコメントに依存しません。繰り返しますが、簡単な例を挙げたいと思います。これは、where() が joins() に依存している場合に当てはまります。
class Post < ActiveRecord::Base
has_many :comments, :dependent => :destroy
default_scope joins(:comments).where("comments.id < 999")
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
次のコマンドを実行します。
Post.update_all(:title => Time.now)
次のクエリを生成し、最終的に ActiveRecord::StatementInvalid をスローします。
UPDATE `posts` SET `title` = '2010-10-15 15:59:27' WHERE (comments.id < 999)
繰り返しますが、update_all、delete_all、destroy_all は同じように動作します。counter_cache を更新しようとしたときにアプリケーションが不平を言ったときに、この動作を発見しました。最終的に update_all にドリルダウンします。