class User < ApplicationRecord
# fields: id, username, last_visit_domain
end
class Domain < ApplicationRecord
# field: id, domain, description
end
users 表:
id | username | last_visit_domain |
---|---|---|
1 | david | twitter.com |
2 | jacky | facebook.com |
domains 表:
id | domain | description |
---|---|---|
1 | twitter.com | 推特 |
2 | facebook.com | 非死不可 |
我分别有两个模型,想通过User
的last_visit_domain
字段关联到Domain
的domain
,然后得到每个last_visit_domain
对应的description
。
在不使用 join 的前提下,请问同学们有没有办法利用 eager load 的方法,实现类似下面的效果?
User.all.each do |user|
puts user.username
puts user.last_visit_domain
puts user.domain.description
end
david
twitter.com
推特
jacky
facebook.com
非死不可
# 首先在取用户列表时,将当前页所有用户的 last_visit_domain 存入一个数组,去重去空
users = User.page(params[:page])
last_visit_domains = users.map(&:last_visit_domain).compact!.uniq!
# 然后根据 last_visit_domains 找到相关的域名记录
# 重点是使用index_by将结果集转成以domain字段为key的hash
domains = Domain.where(domain: last_visit_domains).index_by(&:domain)
# 显示每个用户时
users.each do |user|
# 找到 last_visit_domain 对应的域名的 description
puts domains[user.last_visit_domain].description
end