Не удается перезагрузить ассоциацию ActiveRecord с контроллера - PullRequest
1 голос
/ 08 июня 2009

Потратил на это рабочий день.

У меня есть

class Box
  has_many :users, :through => :subscriptions
end

У меня также есть пользовательские методы insert_new_users и associate_with(new_users), которые используют несколько INSERT для быстрого выполнения своей работы. Во всяком случае, они работают нормально. У меня также есть эта строка в конце метода "associate_with":

def associate_with
  # mysql INSERT here
  self.users(true) # Should force reload
end

Он работает, как и ожидалось, при работе в тестовой среде (тесты как контроллера, так и модели), и он завершается с ошибкой, как и ожидалось, если удалить аргумент true, который вызывает перезагрузку. Он также работает с script/console в разработке, если я update_attributes модель. Но не удается в разработке или производстве, когда я пытаюсь update_attributes от контроллера. Он просто не перезагружает ассоциации, и я вижу его в журналах, где для этого запроса написано «CACHE (0.0ms)».

Странная вещь - она ​​работала раньше, и я не могу определить момент, когда она перестала работать по некоторым причинам. Я надеялся, что кто-то знает, как это возможно.

Ответы [ 3 ]

3 голосов
/ 09 июня 2009

Вы видите влияние кэша SQL-запросов ActiveRecord.

Либо оберните ссылки pre-INSERT для ассоциации users в вызове uncached

self.class.uncached do
  # ...
end

Это остановит ActiveRecord от кэширования результатов любых запросов внутри блока. Если у вас есть код во многих местах, это может раздражать.

Вы также можете очистить кеш после того, как закончите вставку, вызвав connection.clear_query_cache.

0 голосов
/ 15 апреля 2014

Единственный способ полностью очистить кеш - это вызвать reload. Например, вы можете позвонить

User.reload

и это должно принудительно очистить кеш, включая любые отношения или ассоциации.

0 голосов
/ 09 июня 2009

До сих пор я был в состоянии обмануть AR следующим:

def associate_with
  # mysql INSERT here
  @users = self.users.find(:all, :conditions => ['users.id IS NOT NULL'])
end

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