2013-04-10 3 views
1

У меня есть коллекция неактивных моделей записей, каждая из которых имеет несколько внешних ключей. Я хотел бы получить нагрузку в ассоциациях, но я борюсь с этим подходом. Код выглядит примерно так:Eager Loading Outside Active Record

Модель:

class Tuple 
    attr_accessor :widget_id 
    attr_accessor :woogle_id 

    def self.all 
    # returns a bunch of tuples with ids 
    end 

    def widget 
    @widget ||= Widget.find(widget_id) 
    end 

    def woogle 
    @woogle ||= Woogle.find(woogle_id) 
    end 
end 

Вид:

- Tuple.all.each do |tuple| 
    = render tuple.widget 
    = render tuple.woogle 

Любые мысли о том, как нетерпеливый нагрузки вне активной записи и избежать N + 1 запросов в этом случае?

+0

Что вы используете вместо ActiveRecord? Как хранятся ваши записи? – Substantial

+0

@gg_s Связанные записи поддерживаются ActiveRecord (только Tuple не поддерживается Active Record) –

ответ

1

Этот код должен работать для вас, хотя было бы неплохо, если бы там были чист способом установить @woogle и @widget переменного экземпляра:

def self.all 
    # get a bunch of tuples with ids 
    all_tuples = some_logic 
    widgets = Widget.where(id: all_tuples.map(&:widget_id)).inject({}){|m, w| m[w.id] = w; m} 
    woogles = Woogle.where(id: all_tuples.map(&:woogle_id)).inject({}){|m, w| m[w.id] = w; m} 
    all_tuples.each do |t| 
    t.instance_variable_set :@widget, widgets[t.widget_id] 
    t.instance_variable_set :@woogle, woogles[t.woogle_id] 
    end 
end 

Обратите внимание, что если какое-либо объединение виджетов или Woogle для кортежей идентично, только один экземпляр этой ассоциации действительно загружен и совместно используется связанными Tuples