Your SlideShare is downloading. ×
MongoMapper - Mapping Ruby to and from Mongo
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

MongoMapper - Mapping Ruby to and from Mongo

9,942
views

Published on


1 Comment
19 Likes
Statistics
Notes
No Downloads
Views
Total Views
9,942
On Slideshare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
164
Comments
1
Likes
19
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. MongoMapper Mapping Ruby To and From Mongo MongoSF San Francisco, CA John Nunemaker April 30, 2010 Ordered List
  • 2. Using Extending Prophesying
  • 3. Using Extending Prophesying
  • 4. ...and many more.
  • 5. class Item end
  • 6. class Item include MongoMapper::Document end
  • 7. class Datum include MongoMapper::EmbeddedDocument end
  • 8. Free Stuff
  • 9. Free Stuff Persistence
  • 10. Free Stuff Persistence Validations [presence, length, inclusion, ...]
  • 11. Free Stuff Persistence Validations [presence, length, inclusion, ...] Callbacks [before/after validate, create, save, ...]
  • 12. Free Stuff Persistence Validations [presence, length, inclusion, ...] Callbacks [before/after validate, create, save, ...] Associations [many, belongs_to, one, ...]
  • 13. Free Stuff Persistence Validations [presence, length, inclusion, ...] Callbacks [before/after validate, create, save, ...] Associations [many, belongs_to, one, ...] Serialization [to_json]
  • 14. Persistence Never gonna give you up
  • 15. item = Item.create({ :title => 'MongoSF', :location => 'San Fran', :when => Time.now })
  • 16. puts item.to_mongo { "_id" => ObjectID('4bd8cc5cbcd1b313b3000001'), "title" => "MongoSF", "location" => "San Fran", "when" => Wed Apr 28 17:01:32 -0700 2010 }
  • 17. item = Item.new item[:title] = 'MongoSF' item[:location] = 'San Fran' item[:when] = Time.now item.save
  • 18. puts item.to_mongo { "_id" => ObjectID('4bd8cc5cbcd1b313b3000001'), "title" => "MongoSF", "location" => "San Fran", "when" => Wed Apr 28 17:01:32 -0700 2010 }
  • 19. Types What you be baby boo?
  • 20. class Item include MongoMapper::Document key :title, String key :path, String end
  • 21. But Mongo is Schema-less?
  • 22. Instead of database schema Think App Schema
  • 23. Built-in Types Array, Binary, Boolean, Date, Float, Hash, Integer, Nil, ObjectId, Set, String, Time
  • 24. Custom Types Its shake and bake and I helped!
  • 25. class Set def self.to_mongo(value) value.to_a end def self.from_mongo(value) Set.new(value || []) end end
  • 26. class DowncasedString def self.to_mongo(value) value.nil? ? nil : value.to_s.downcase end def self.from_mongo(value) value.nil? ? nil : value.to_s.downcase end end
  • 27. class User include MongoMapper::Document key :email, DowncasedString end
  • 28. Typeless I do not know who I am
  • 29. class Foo include MongoMapper::Document key :bar end foo = Foo.new foo.bar = 'Some text' # foo.bar => "Some text" foo.bar = 24 # foo.bar => 24
  • 30. Validations Currently using fork of validatable
  • 31. class Item include MongoMapper::Document key :title, String validates_presence_of :title end
  • 32. class Item include MongoMapper::Document key :title, String, :required => true end
  • 33. validates_presence_of validates_length_of validates_format_of validates_numericality_of validates_acceptance_of validates_confirmation_of validates_inclusion_of validates_exclusion_of
  • 34. Callbacks Ripped from AS2’s cold, dead fingers
  • 35. class Item include MongoMapper::Document key :title, String key :path, String key :parent_id, ObjectId belongs_to :parent before_validation :set_path private def set_path self.path = parent.path + title.parameterize end end
  • 36. :before_save, :after_save, :before_create, :after_create, :before_update, :after_update, :before_validation, :after_validation, :before_validation_on_create, :after_validation_on_create, :before_validation_on_update, :after_validation_on_update, :before_destroy, :after_destroy, :validate_on_create, :validate_on_update, :validate
  • 37. Associations I belong to you
  • 38. to Docs belongs_to, one, many, many :in
  • 39. class Account include MongoMapper::Document many :sites end class Site include MongoMapper::Document key :account_id, ObjectId belongs_to :account end
  • 40. account = Account.create(:title => 'OL', :sites => [ Site.new(:title => 'OL', :domain => 'orderedlist.com'), Site.new(:title => 'RT', :domain => 'railstips.org'), ])
  • 41. [ { '_id' => ObjectID('...'), 'title' => 'OL', 'domain' => 'orderedlist.com' 'account_id' => ObjectID('...'), }, { '_id' => ObjectID('...'), 'title' => 'RT', 'domain' => 'railstips.org' 'account_id' => ObjectID('...'), } ]
  • 42. to Embedded Docs many, one
  • 43. class Item include MongoMapper::Document many :data end class Datum include MongoMapper::EmbeddedDocument key :key, String key :value end
  • 44. Item.create(:title => 'MongoSF', :data => [ Datum.new(:key => 'description', :value => 'Awesome.') ])
  • 45. { '_id' => ObjectID('...'), 'title' => 'MongoSF', 'data' => [ { '_id' => ObjectID('...'), 'key' => 'description' 'value' => 'Awesome.', } ] }
  • 46. Using Extending Prophesying
  • 47. Plugins Conventional way to extend
  • 48. MongoMapper is Powered by Plugins associations, callbacks, clone, descendants, dirty, equality, identity_map, inspect, keys, logger, modifiers, pagination, persistence, protected, rails, serialization, timestamps, userstamps, validations
  • 49. module MongoMapper module Plugins def plugins @plugins ||= [] end def plugin(mod) extend mod::ClassMethods if mod.const_defined?(:ClassMethods) include mod::InstanceMethods if mod.const_defined?(:InstanceMethods) mod.configure(self) if mod.respond_to?(:configure) plugins << mod end end end
  • 50. module ActsAsListFu module ClassMethods def reorder(ids) # reorder ids... end end module InstanceMethods def move_to_top # move to top end end def self.configure(model) model.key :position, Integer, :default => 1 end end
  • 51. class Foo include MongoMapper::Document plugin ActsAsListFu end Foo.reorder(...) Foo.new.move_to_top
  • 52. Good Example Joint: github.com/jnunemaker/joint
  • 53. class Asset include MongoMapper::Document plugin Joint attachment :image attachment :file end
  • 54. asset = Asset.create({ :image => File.open('john.jpg', 'r'), :file => File.open('foo.txt', 'r'), }) asset.image.id asset.image.name asset.image.type asset.image.size asset.image.read
  • 55. Descendant Appends Fancy Schmancy and Stolen
  • 56. module FancySchmancy def some_method puts 'some method' end end MongoMapper::Document.append_extensions(FancySchmancy) class Foo include MongoMapper::Document end Foo.some_method # puts 'some method' Foo.new.some_method # NoMethodError
  • 57. module FancySchmancy def some_method puts 'some method' end end MongoMapper::Document.append_inclusions(FancySchmancy) class Foo include MongoMapper::Document end Foo.new.some_method # puts 'some method' Foo.some_method # NoMethodError
  • 58. module FancySchmancy def some_method puts 'some method' end end class Foo include MongoMapper::Document end MongoMapper::Document.append_extensions(FancySchmancy) class Bar include MongoMapper::Document end Foo.some_method # puts 'some method' Bar.some_method # puts 'some method'
  • 59. module IdentityMapAddition def self.included(model) model.plugin MongoMapper::Plugins::IdentityMap end end MongoMapper::Document.append_inclusions(IdentityMapAddition)
  • 60. Using Extending Prophesying
  • 61. Active Model Validations, callbacks, serialization, etc.
  • 62. Blank Document Mix and match whatever you want
  • 63. Mongo::Query Fancy query magic for the ruby driver github.com/jnunemaker/mongo-query
  • 64. ideafoundry.info/mongodb
  • 65. mongotips.com
  • 66. railstips.org
  • 67. Thank you! john@orderedlist.com @jnunemaker MongoSF San Francisco, CA John Nunemaker April 30, 2010 Ordered List

×