ActiveRecord包括:如何访问由activerecord执行的多个查询结果?

时间:2015-03-12 04:12:53

标签: ruby-on-rails ruby activerecord

我有以下查询加载关联:

contacts = current_user.contacts.includes(:contact_lists).where(id: subscribed_contact_ids)

[DEBUG] Contact Load (2.6ms) SELECT "contacts".* FROM "contacts" WHERE "contacts"."user_id" = 7 AND "contacts"."id" IN (4273, 4275, 4277, 4278, 4281, 4285, 4297, 4305, 4307, 4308, 4315, 4318, 4323, 4326, 4331, 4333, 4344, 4349, 4359, 4361, 4368, 4372, 4373, 4378, 4382, 4389, 4392, 4394, 4404, 4428, 4450, 4469, 4473, 4489, 4490, 4495, 4497, 4498, 4501, 4505, 4514, 4520, 4525, 4536, 4545, 4554, 4555, 4561, 4568, 4572)

[DEBUG] Subscription Load (0.8ms) SELECT "subscriptions".* FROM "subscriptions" WHERE "subscriptions"."contact_id" IN (4273, 4275, 4277, 4278, 4281, 4285, 4297, 4305, 4307, 4308, 4315, 4318, 4323, 4326, 4331, 4333, 4344, 4349, 4359, 4361, 4368, 4372, 4373, 4378, 4382, 4389, 4392, 4394, 4404, 4428, 4450, 4469, 4473, 4489, 4490, 4495, 4497, 4498, 4501, 4505, 4514, 4520, 4525, 4536, 4545, 4554, 4555, 4561, 4568, 4572)

[DEBUG] ContactList Load (0.5ms) SELECT "contact_lists".* FROM "contact_lists" WHERE "contact_lists"."id" IN (9, 8)

我还需要获得明确的contact_lists,基本上我需要单独加载上一个查询的结果。

所以问题是:是否可以加载这些联系人列表而无需再次运行复杂的查询?

迭代遍历每条记录以获取contact_lists然后删除重复项的选项根本不具吸引力。 另一种选择是再次运行复杂的连接查询(似乎也不是很好):

contact_list_ids = current_user.subscriptions.select('distinct contact_list_id').where(contact_id: contact_ids).pluck(:contact_list_id)
current_user.contact_lists.where(id: contact_list_ids)

这些查询在某处缓存。有没有办法直接访问查询缓存?

1 个答案:

答案 0 :(得分:1)

这是您的问题的解决方案。但是它需要你修补补丁轨道,这可能不是一个好主意。

How do I get the last SQL query performed by ActiveRecord in Ruby on Rails?

我宁愿遍历联系人并将contact_lists存储在其id为关键字的哈希中。那你就不用担心重复了

contact_lists = {}
contacts.each { |c| c.contact_lists.each { |cl| contact_lists[cl.id] = cl } }

或其他什么。