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

wfwdex · April 25, 2017 · Last by wfwdex replied at April 27, 2017 · 2347 hits
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 能不能做到这样的关联?

Reply to liukun_lk

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

4 Floor has deleted
Reply to wfwdex

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

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

Reply to lithium4010

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

wfwdex closed this topic. 15 May 16:18
You need to Sign in before reply, if you don't have an account, please Sign up first.