如何在rails中的查询中选择相关对象?

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中做到这一点的?

DGM*_*DGM 5

在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个查询.