Rails 获取 has_many 和 belongs_to 生成的 SQL

ery · 发布于 2014年04月11日 · 最后由 xinhuahunter 回复于 2014年08月29日 · 1450 次阅读
594

获取has_many和belongs_to生成的SQL

有的时候我们想要分析 Rails ORM 生成的SQL has_many 关系 比较容易获取 belongs_to 关系 稍微麻烦一些 关键点在于 ActiveRecord::Relation#to_sql

https://github.com/rails/rails/blob/v3.2.17/activerecord/lib/active_record/relation.rb#L458

class Customter
  has_many :orders
end

class Order
  belongs_to :customter
end

Customter.first.orders.to_sql
# => SELECT `orders`.* FROM `orders`  WHERE `orders`.`customer_id` = 136
# => BTW 136 is customer_id

Order.first.association(:customer).association_scope.to_sql
# => SELECT `customers`.* FROM `customers`  WHERE `customers`.`id` = 136
# => BTW 136 is customer_id

Customter.first.orders.proxy_association.association_scope.class
# => ActiveRecord::Relation

Order.first.association(:customer).association_scope.class
# => ActiveRecord::Relation

关于更多技术实现细节, 可以研究 ActiveRecord::Associations#association

https://github.com/rails/rails/blob/v3.2.17/activerecord/lib/active_record/associations.rb#L155

共收到 5 条回复
1924

简单的在Console 中跑一下代码就看到生成的SQL了

594

#1楼 @uudui 也可以,但是有的时候,SQL很多,看起来不清晰

654
puts School.where("id = 1").explain

并且可以这样来看explain结果,优化查询。

594

#3楼 @davidqhr +1 灰长好

96

资深/Lead开发工程师(ruby)

岗位职责: 1.在技术和运营上负责一个或多个产品组件、关键应用的架构改造、升级、研究与开发 2.关注互联网与广告热点技术的发展方向,敢于提出、评估并应用新技术,带领团队开发新的工具,帮助提高现有系统的效率、降低运营成本、提高可靠性 3.作为技术专家,解决系统开发中的疑难问题。在产品特性与架构演化之间做出良好的技术决策、平衡与取舍 4.能够与产品经理、管理团队进行良好地沟通合作,确保项目按时、保质完成 5.培养团队中有潜质的工程师

任职资格的具体描述: 1.本科及以上学历,计算机相关专业,(Lead 5,Senior 3)年以上工作经验,其中至少(Lead 3,Senior 2)年以上的大型核心业务系统开发经验 2.掌握多种主流程序设计语言, 有大型Web应用开发和架构经验,熟悉主流Web应用框架,精通Ruby或Java、PHP 3.熟悉Linux操作系统、网络和关系型数据库的应用开发与优化 4.对设计模式、软件工程、用户体验等有较深入的理解 5.喜欢团队协作,擅长沟通(Lead还需具备一定的技术团队管理经验) 6.可以熟练地使用英文工作,适应外企环境

关于 FreeWheel北京(飞维美地信息技术(北京)有限公司)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册