我正在尝试获取可能仅与特定用户相关的特定关键字并返回关系。
Keyword.where(text: ['key1', 'key2'])
.tagged_users(:u, :rel)
.where(uid: [100, 101])
.pluck(:rel).each_with_object({}) do |rel, obj|
uid = rel.to_node.uid
keyword = rel.from_node.text
obj[uid] ? obj[uid] << keyword : obj[uid] = [keyword]
end
假设我们与用户 100 只有一个关系,用关键字'key2'标记,期望的结果是 {100 => ['key2'] }
上面的代码有效,但对于每个rel
它都对数据库执行 2 次查询;一为rel.to_node
一为rel.from_node
。
我希望有一个“急切加载”的解决方案rel.from_node
,rel.to_node
因此整个代码段只会执行一个查询。
(另一种解决方案是为每个关键字运行并获取它的标记用户,但这也需要许多查询。)