Der*_*rek 0 ruby sql activerecord ruby-on-rails
来自django,我们有一个名为select_related的东西,它在执行查询时执行连接,以便也获取相关对象的数据.
例如
# rails + select_related
p = Person.where(job: 1).select_related("job_name")
# so the return query list has objects that
# can call person.job.job_name without another query
# because selected_related did a join on jobs table
Run Code Online (Sandbox Code Playgroud)
你是如何在rails/activerecord中做到这一点的?
在rails中,includes
用于处理连接表更常见.它可以执行左外连接(当where条件需要引用连接表时)或另外一个查询,例如select * from jobs where id IN (1,3,4,5)
解决n + 1优化问题.
在你的情况下,我会:
p = Person.where(job: 1).includes(:jobs)
job = p.job.job_name
Run Code Online (Sandbox Code Playgroud)
这仍然使用两个查询,但这不是它优化的用例(并且这种情况不值得优化)但是如果你有一个更复杂的情况它会变得更好:
people = Person.where(status: 'active').includes(:jobs)
people.each {|p| puts p.job.job_name}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它仍然只执行2个查询.