使用Active Record删除冗余查询

时间:2013-05-08 14:29:03

标签: ruby-on-rails database activerecord

以下代码有效,但我喜欢运行太多的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的{​​{1}}内部,这很好但Rails正在运行额外的SQL调用来查找名称,我想要做的是在初始查找中捕获此信息。

我的问题是因为profile.country.namecountry相关联而不是profile我无法将其添加到user,因为它不会将其视为.includes可链接表。我可以做些什么来强制包含加入链接到profile的表吗?

相关型号信息如下;

用户:

has_one  :profile, dependent: :destroy

资料:

belongs_to :user
belongs_to :country

国家:

has_many :profiles

1 个答案:

答案 0 :(得分:2)

您应该可以在原始查询中包含国家/地区,方法是将其嵌入.includes调用中的个人资料下:

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