2013-04-10 68 views
1

我有一个集合非活动记录模型,每个都有几个外键。我想急切地加入协会,但我正在为这种方法而努力。该代码看起来是这样的:渴望加载外活动记录

型号:

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 2013-04-10 23:33:58

+0

@gg_s关联的记录由ActiveRecord支持(只有Tuple不支持Active Record) – 2013-04-11 02:42:56

回答

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协会的元组是相同,该关联只有一个实例实际上是由相关元组加载并共享的