Rails 两个模型分别使用指定字段进行关联怎么实现?

wfwdex · 2017年04月25日 · 最后由 wfwdex 回复于 2017年04月27日 · 2347 次阅读
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 非死不可

我分别有两个模型,想通过Userlast_visit_domain字段关联到Domaindomain,然后得到每个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
非死不可

(2017.05.15) 找到一个手动 eager load 的方法:

# 首先在取用户列表时,将当前页所有用户的 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

虽然还可以使用 redis 缓存 domains 表,但还是想知道 eager load 能不能做到这样的关联?

liukun_lk 回复

从生成的 SQL 看,这个最终还是会INNER JOIN,但我的两个表是在两个不同的数据库中,这样似乎不成立。 还是谢谢你的回复。

4 楼 已删除
wfwdex 回复

为什么要是在两个不同的数据库中?

在两个不同的数据库中应该至少要查两次?你用什么数据库?

lithium4010 回复

项目需要,有一个表其实是一个日志表,专门放在日志数据库里,我为了方便理解,简化了一下描述,用的 mysql。

wfwdex 关闭了讨论。 05月15日 16:18
需要 登录 后方可回复, 如果你还没有账号请 注册新账号