Как предотвратить фильтрацию запросов внутри обратных вызовов модели Rails по id - PullRequest
0 голосов
/ 13 декабря 2018

Я только что обновил Rails 5.0 до 5.2, и один из используемых обратных вызовов, похоже, ограничивает запросы исходными идентификаторами запросов.Это мешает мне пересчитать совокупную статистику.Как я могу запретить обратные вызовы?

Например, скажем, у меня есть следующие модели:

class Area < ActiveRecord::Base
  has_many :posts,
    through :area_posts

  def count_area_posts
    byebug
    # some unrelated stuff
  end
end

class Post < ActiveRecord::Base
  has_many :areas,
    through :area_posts
end

class AreaPost < ActiveRecord::Base
  belongs_to :post
  belongs_to :area

  after_commit :update_area_status

  def update_area_status
    self.area.count_area_posts
  end
end

Если я достигну точки останова в Area.count_area_posts, запустив AreaPost.where(id: 5).update(unrelated_thing: 10), любойзапросы по модели AreaPost имеют дополнительное предложение WHERE, которое я не включил явно:

   15:  def count_area_posts
   16:    byebug  
=> 17:    # some unrelated stuff
   18:  end
   19:end
(byebug) AreaPost.count
    (15.3ms)  SELECT COUNT(*) FROM "area_posts" WHERE "area_posts"."id" = $1  [["id", 5]]
1
(byebug)

Однако, если я обновлю каждый AreaPost по одному:

@post.area_posts.each do |area_post|
  area_post.update_attribute(unrelated_thing: 10) # this works as expected. AreaPost.count inside the callback is not scoped by id
end

Запрос AreaPost.count не ограничен идентификатором:

   15:  def count_area_posts
   16:    byebug  
=> 17:    # some unrelated stuff
   18:  end
   19:end
(byebug) AreaPost.count
    (15.3ms)  SELECT COUNT(*) FROM "area_posts"
182253
(byebug)

Почему он фильтруется по идентификатору, когда я не передал идентификатор в запрос count?Как я могу запретить обратный вызов для этого идентификатора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...