Cha*_*had 16 activerecord ruby-on-rails ruby-on-rails-3
有谁能解释一下?
Project.includes([:user, :company])
Run Code Online (Sandbox Code Playgroud)
这将执行3个查询,一个用于获取项目,一个用于获取这些项目的用户,另一个用于获取公司.
Project.select("name").includes([:user, :company])
Run Code Online (Sandbox Code Playgroud)
这将执行3个查询,并完全忽略选择位.
Project.select("user.name").includes([:user, :company])
Run Code Online (Sandbox Code Playgroud)
这将使用正确的左连接执行1个查询.并且仍然完全忽略了选择.
在我看来,rails忽略带有包含的select.好的,但为什么当我在select中放入相关模型时,它会从发出3个查询切换到发出1个查询?
请注意,1查询是我想要的,我无法想象这是获得它的正确方法,也不是它的工作原理,但我不确定如何在一个查询中获得结果(.joins似乎只是使用我实际上并不想要的INNER JOIN,当我手动指定连接条件为.joins搜索gem时,我们正在尝试重新添加具有相同名称的连接.
小智 25
我和select和includes有同样的问题.为了急切加载相关模型,我使用了原生的Rails范围'preload'http: //apidock.com/rails/ActiveRecord/QueryMethods/preload 它提供了急切的加载而没有在范围链上跳过'select'.
我在这里找到了它https://github.com/rails/rails/pull/2303#issuecomment-3889821
希望这个提示对某些人有帮助,因为它对我有帮助.
好吧,所以这就是我想出来的......
.joins("LEFT JOIN companies companies2 ON companies2.id = projects.company_id LEFT JOIN project_types project_types2 ON project_types2.id = projects.project_type_id LEFT JOIN users users2 ON users2.id = projects.user_id") \
.select("six, fields, I, want")
Run Code Online (Sandbox Code Playgroud)
工程,疼痛的屁股,但它让我只是我需要在一个查询的数据.唯一糟糕的部分是我的,因为我们正在使用meta_search,这似乎无法找出一个表已被合并时,可以指定自己的加盟条件,提供一切MODEL2别名.
| 归档时间: |
|
| 查看次数: |
16467 次 |
| 最近记录: |