MongoMapper lightning talk

  • 1,121 views
Uploaded on

Lightning talk from IPRUG, 2 August 2011.

Lightning talk from IPRUG, 2 August 2011.

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,121
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
5
Comments
0
Likes
2

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
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Transcript

  • 1. MongoMapper Kerry BuckleyIPRUG Lightning talk, 2 August 2011
  • 2. What is it?
  • 3. What is it?
  • 4. Why we switched
  • 5. Why we switched• Modelling complex object hierarchy• Painfully-complex polymorphic associations • (and about to get worse)• Data seemed to suit a document DB
  • 6. Document class User include MongoMapper::Document key :username, String key :real_name, String key :date_of_birth, Dateend
  • 7. Supported types• Array • Object • Date• Float • String • ObjectId• Hash • Time • Set• Integer • Binary• NilClass • Boolean
  • 8. Custom types module MongoMapper::BigDecimal def to_mongo value value.to_s end def from_mongo value value.present? ? new(value.to_s) : nil endendBigDecimal.send :extend, MongoMapper::BigDecimalclass Person include MongoMapper::Document key :height, BigDecimalend
  • 9. Database migrations
  • 10. Database migrations This page intentionally left blank
  • 11. Time and user stamps class Article include MongoMapper::Document key :title, String key :body, String timestamps! userstamps!endclass User include MongoMapper::Document key :name, Stringend
  • 12. Simple associations class Owner include MongoMapper::Document many :petsendclass Pet include MongoMapper::Document belongs_to :owner one :bedendclass Bed include MongoMapper::Document belongs_to :petend
  • 13. Embedded document class Order include MongoMapper::Document many :line_itemsendclass LineItem include MongoMapper::EmbeddedDocument key :name, String key :quantity, Integerend
  • 14. Many-to-many class Book include MongoMapper::Document key :title key :author_ids, Array many :authors, :in => :author_idsendclass Author include MongoMapper::Document key :nameend
  • 15. Basic polymorphism class BlogPost include MongoMapper::Document key :body many :comments, :as => :commentableendclass HomePage include MongoMapper::Document key :content many :comments, :as => :commentableendclass Comment include MongoMapper::Document key :text belongs_to :commentable, :polymorphic => true
  • 16. SCI polymorphismclass Commentable include MongoMapper::Document many :commentsendclass BlogPost < Commentable key :bodyendclass HomePage < Commentable key :contentendclass Comment include MongoMapper::Document key :text belongs_to :commentableend
  • 17. Reverse polymorphism class Site include MongoMapper::Document many :pagesendclass Page include MongoMapper::Document belongs_to :siteendclass HomePage < Page key :contentendclass BlogPost < Page key :body
  • 18. M2M polymorphism class Book include MongoMapper::Document key :author_ids, Array many :authors, :in => :author_idsendclass Novel < Bookendclass Textbook < Bookendclass Author include MongoMapper::Documentendclass Editor < Authorend
  • 19. Validations class Member include MongoMapper::Document key :name, String key :age, Integer key :sex, String validates_uniqueness_of :name validates_presence_of :name validates_numericality_of :age validates_inclusion_of :sex, :in => %w{male female} validate :custom_validation def custom_validation ... endend
  • 20. Validation shorthand class Member include MongoMapper::Document key :name, String, :required => true, :unique => true key :age, Integer, :numeric => true key :sex, String, :in => %w{male female} validate :custom_validation def custom_validation ... endend
  • 21. Querying class User include MongoMapper::Document key :first_name, String key :last_name, String scope :smiths, where(:last_name => "Smith")endUser.find "4e0c70aea7a6c32ab5000003"User.find_by_first_name "Kerry"User.find_by_first_name! "Kerry"User.find_by_first_name_and_last_name "Kerry", "Buckley"User.find_all_by_last_name "Buckley"User.smiths.find_by_first_name "John"
  • 22. Modifiers class Page include MongoMapper::Document key :title, String key :hit_count, Integer, :default => 0 key :tags, Arrayend@page.increment :hit_count => 1Page.increment {:title => "Home"}, :hit_count => 1Page.set {:title => "Home"}, :title => "New Home"Page.unset {:title => "Home"}, :titlePage.push {:title => "Home"}, :tags => "foo"
  • 23. Gotchas
  • 24. Gotchas• No transactions• find versus find!• Writes are fire-and-forget by default• Uniqueness is per class, not per collection• Formtastic needs hints of field type
  • 25. Reflections
  • 26. Reflections• Longish but fairly painless switch• Acceptance/integration tests invaluable• Specs/unit tests a pain to migrate• Decouple behaviour from persistence!
  • 27. Fin.