2013-05-08 58 views
0

以下代码有效,但为我的喜好运行太多的SQL语句;使用活动记录删除冗余查询

User.includes([:profile,:roles]).select("id, email, created_at, confirmed_at, countries.name").find_in_batches do |users| 
     users.map{|u| # In here I access profile.country.name} 
end 

什么是要抓住用户信息以及一些配置文件信息并将其放入一个csv格式。

.map里面,我打电话给profile.country.name这很好,但Rails运行一个额外的SQL调用来查找名称,我想要做的就是在我的初始查找中捕获这些信息。

我的问题是,由于country链接到profile而不是user我不能将其添加到我的.includes,因为它没有看到它作为一个可链接表。有什么我可以做的强迫包括加入一个表链接到profile

相关型号信息如下;

用户:

has_one :profile, dependent: :destroy 

简介:

belongs_to :user 
belongs_to :country 

国家:

has_many :profiles 

回答

2

您应该能够由下轮廓筑巢它包括原始查询的国家。包括电话:

User.includes({:profile => [:country], :roles}) 
+0

干杯巴里,我不得不打更多的[]使其工作:'包括(:配置文件=> [:国家],::角色=> [])' – Toby 2013-05-08 14:42:10

+0

啊,是的,当然我忘了它必须成为一个散列而不是数组来允许key =>值表示法。 – brrygrdn 2013-05-08 14:44:19