Я считаю, что это ошибка в Rails 3. Я надеюсь, что кто-то здесь может направить меня в правильном направлении. Код, размещенный ниже, предназначен исключительно для иллюстрации этой проблемы. Надеюсь, это не запутает проблему.
Учитывая, что у меня есть модель сообщения и модель комментария. Публикация имеет_many комментариев и комментарий принадлежит_к сообщению.
С 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.