例如我有两张表:
我想在一个页面列出所有 brands,以及每个 brand 下面的 devices。
我现在的做法是先 @brands = Brand.all,然后通过循环取每个 brand 下面的 devices,就像下面这样:
@brands.each do |brand|
brand.devices.each do |device|
do something...
end
end
但是看日志,每次 brand.devices.each 都会再去查询一次。
想请教一下,怎样做到关联查询,一次性把 brands 及下面的 devices 一起按结构层级取出来?
@huacnlee 刚才试了一下@brands = Brand.includes(:devices)
,发现控制台输入的查询似乎是对的:
MONGODB demo_development['brands'].find({}).sort([[:name, :asc]])
MONGODB demo_development['devices'].find({"brand_id"=>{"$in"=>[BSON::ObjectId('4f03391e11aa2b1401000001'), BSON::ObjectId('4f03391e11aa2b1401000004'), BSON::ObjectId('4f03391e11aa2b1401000008'), BSON::ObjectId('4f03391e11aa2b1401000006')]}}).sort([["name", :asc]])
但是到我循环显示brand.devices.each
的时候,还是会再去查询 devices:
MONGODB demo_development['brands'].find({}).sort([[:name, :asc]])
MONGODB demo_development['devices'].find({"brand_id"=>BSON::ObjectId('4f03391e11aa2b1401000001')}).sort([["name", :asc]])
MONGODB demo_development['devices'].find({"brand_id"=>BSON::ObjectId('4f03391e11aa2b1401000004')}).sort([["name", :asc]])
MONGODB demo_development['devices'].find({"brand_id"=>BSON::ObjectId('4f03391e11aa2b1401000008')}).sort([["name", :asc]])
MONGODB demo_development['devices'].find({"brand_id"=>BSON::ObjectId('4f03391e11aa2b1401000006')}).sort([["name", :asc]])
然后我用 rails console,输入Brand.includes(:devices).to_a
,显示的也只有 brands 这一级内容,devices 没有显示。
是我哪里没搞正确吗?
In order for #includes to work the Mongoid identity map must be enabled in the mongoid.yml:
identity_map_enabled: true
你看看是不是忘记设置这个
哦,我搞错了,这个 has_many 的好像无法 includes 的
Mongoid 官方都有这种用法,不过现在 Ruby China 的“酷站”里面都不行
http://mongoid.org/docs/querying/criteria.html#includes
问题解决了,我犯了个低级错误,把 identity_map_enabled: true 加到 development:外面去了。。。 加到 development:里就正常了。。。 掩面奔逃。。。
#20 楼 @tanjianna brand has_many devices
可以直接,brand.devices 啊。如果需要查询条件,跟上 where 即可