--- Revision None +++ Revision 363533633036 @@ -0,0 +1,89 @@ +require 'rubygems' +require 'relaxdb' + +# Specify the db to be used. Create it in CouchDB yourself locally. + +RelaxDB::Database.set_std_db :host => "localhost", :port => 5984, :db => "photos" + +# +# Define the classes +# + +class Photo < RelaxDB::Document + + property :name + property :tags + +end + +class Tag < RelaxDB::Document + + property :name + property :photos + +end + +# +# Create the views +# + +tags_view = < "mg", :name => "Migration").save +des = Photo.new(:_id => "des", :name => "Dar es Salaam").save + +wd = Tag.new(:_id => "wd", :name => "wildebeest").save +tz = Tag.new(:_id => "tz", :name => "tanzania").save + +# Being forced to use ids and set the relationship on both sides is clunky and error +# prone, but it's no more than a current limitation of the library + +mg.tags = [wd._id, tz._id] +des.tags = [tz._id] + +wd.photos = [mg._id] +tz.photos = [mg._id, des._id] + +RelaxDB.bulk_save(mg, des, wd, tz) + +# +# Examine the data, confirm in the CouchDB log that n+1 requests aren't being made +# + +mg = Photo.all_by(:name) { |q| q.key = "Migration"}[0] +mg_tags = Photo.view("all_tags?key=\"#{mg._id}\"") +puts mg_tags.inject("Tags for #{mg.name}") { |m, t| m << " '#{t.name}'" } + +tz = Tag.all_by(:name) { |q| q.key = "tanzania" }[0] +tz_photos = Tag.view("all_photos?key=\"#{tz._id}\"") +puts tz_photos.inject("Photos for #{tz.name}") { |m, p| m << " '#{p.name}'" }