0

来自 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

你如何在 rails/activerecord 中做到这一点?

4

1 回答 1

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

这仍然使用两个查询,但这不是它优化的用例(而且这种情况不值得优化),但如果你有一个更复杂的情况,它会变得更好:

people = Person.where(status: 'active').includes(:jobs)
people.each {|p| puts p.job.job_name}

在这种情况下,它仍然只会执行 2 个查询。

于 2013-11-06T00:37:11.597 回答