【问题标题】:What's more optimal: query chaining parent & child or selecting from parent's child objects什么更优化:查询链接父子对象或从父子对象中选择
【发布时间】:2015-07-27 04:50:28
【问题描述】:
很好奇其中哪一个性能更好。如果您有一个拥有多个 PlanDates 的用户,并且您知道您的用户是变量 current_user 中 id 为 60 的用户,这样做是否更好:
plan_dates = current_user.plan_dates.select { |pd| pd.attribute == test }
OR
plan_dates = PlanDate.joins(:user).where("plan_dates.attribute" => test).where("users.id" => 60)
问是因为我一直在阅读有关使用 select 的危险,因为它构建了整个对象......
【问题讨论】:
标签:
sql
ruby-on-rails
ruby-on-rails-4
activerecord
【解决方案1】:
select 不鼓励使用,因为与 ActiveRelation 方法 where、joins 等不同,它是来自 Enumerable 的 Ruby 方法,这意味着必须加载 整个 user.plan_dates 关系在选择开始之前进入内存。这在小范围内可能没有什么不同,但如果一个普通用户有 3,000 个计划日期,那么你就有麻烦了!
因此,您的第二个选项(仅使用一个 SQL 查询来获取结果)是更好的选择。不过,你也可以这样写:
user.plan_dates.where(attribute: test)
这仍然只是一个 SQL 查询,但利用 ActiveRelation 的强大功能获得更具表现力的结果。
【解决方案2】:
第二个。 select 必须在代码级别比较对象,第二个只是查询。
另外,除非使用变量,否则第二个表达式可能不会实际执行,而第一个表达式将始终执行。