我一直在阅读/玩弄使用 Redis 来补充我的 ActiveRecord 模型的想法,特别是作为一种建模关系的方式。还观看了一些像这样的截屏视频:http ://www.youtube.com/watch?v=dH6VYRMRQFw
在您想要一次获取一个对象的情况下,这似乎是一个好主意,但是当您需要显示对象列表及其每个关联时(例如,在视图中或在对于 API 的 JSON 响应)。
而在纯粹使用 ActiveRecord 的情况下,您可以使用includes
预先加载来避免运行 N 多个查询,但当纯粹依赖 Redis 来建模关系时,我似乎无法想到如何做到这一点。
例如,假设您有以下内容(取自非常有用的redis_on_rails项目):
class Conference < ActiveRecord::Base
def attendees
# Attendee.find(rdb[:attendee_ids])
Attendee.find_all_by_id(rdb[:attendee_ids].smembers)
end
def register(attendee)
Redis.current.multi do
rdb[:attendee_ids].sadd(attendee.id)
attendee.rdb[:conference_ids].sadd id
end
end
def unregister(attendee)
Redis.current.multi do
rdb[:attendee_ids].srem(attendee.id)
attendee.rdb[:conference_ids].srem id
end
end
end
如果我做了类似的事情
conferences = Conference.first(20)
conferences.each {|c|
c.attendees.each {|a| puts a.name}
}
我只是获取前 20 个会议并获取每个会议的与会者并将它们打印出来,但您可以想象这样一种情况,我在视图中的列表中呈现会议以及与会者列表。在上述情况下,我会遇到经典的 N+1 查询问题。
如果我将 SQL 中的关系与 一起建模has_many
,我将能够使用该includes
函数来避免同样的问题。
欢迎提出想法,链接,问题。