Кеширование родительских классов в mongodb - PullRequest
0 голосов
/ 08 декабря 2011

Это моя структура данных.

Foo  
  has_many: bar

Bar  
  belongs_to: Foo

Я пытаюсь написать метод кэширования для Bar, который будет извлекать только «избранные» записи.

def self.get_featured  
  Rails.cache.fetch("featured", :expires_in => 1.day) do  
    self.where(:featured=>true)   
  end  
end

Это работает. Однако представления, которые отображают эти данные, также требуют такой информации, как featured.foo.title, который не кэшируется как часть метода .get_featured.

Каждый раз, когда я называю что-то подобное, БД снова попадает в цель, что происходит> 40 раз на страницу, что приводит к небольшому взрыву БД.

Вопрос, как я могу кэшировать отфильтрованную информацию Bar & Foo для всех отфильтрованных записей этой панели?

1 Ответ

2 голосов
/ 08 декабря 2011

Вы можете использовать mongoid , включая , чтобы загружать данные, указав имена отношений. Но в настоящее время он ограничен 1 уровнем. Так что я верю, что он будет стремиться загрузить фу вместе с избранными, но не уверен насчет бара. Вы можете попробовать это сами

def self.get_featured  
  Rails.cache.fetch("featured", :expires_in => 1.day) do  
    self.includes(:foo,:bar).where(:featured=>true)   
  end  
end

Чтобы это работало, в mongoid.yml должна быть включена карта идентичности Mongoid, как это

identity_map_enabled: true
...