特に関係をモデル化する方法として、Redisを使用してActiveRecordモデルを補完するというアイデアを読んだり遊んだりしています。このようなスクリーンキャストもいくつか見ました:http ://www.youtube.com/watch?v = dH6VYRMRQFw
一度に1つのオブジェクトをフェッチする場合は良い考えのように思えますが、オブジェクトのリストとそれらの各関連付けを表示する必要がある場合(たとえば、ビューまたは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
アイデア、リンク、質問を歓迎します。