More Related Content Similar to Tame Accidental Complexity with Ruby and MongoMapper (20) More from Giordano Scalzo (10) Tame Accidental Complexity with Ruby and MongoMapper15. Origin of Sql
SQL
From Wikipedia, the free encyclopedia
SQL (...), is a database computer language
designed for managing data in relational
database management systems (RDBMS)
16. Origin of Sql
SQL
From Wikipedia, the free encyclopedia
SQL (...), is a database computer language
designed for managing data in relational
database management systems (RDBMS)
18. We need persistent objects!
class User
def initialize(username, password)
@username = username
@password = password
end
end
24. Persistence
class User
include MongoMapper::Document
end
user = User.create({
:username => "giordano",
:password => "123"
})
user.save
25. Persistence
class User
include MongoMapper::Document
end
user = User.create({
:username => "giordano",
:password => "123"
})
user.save
puts User.all.last.to_mongo
26. Persistence
{
"_id"=>BSON::ObjectId('4d643a274d8ff683dd000001'),
"username"=>"giordano",
"password"=>"123"
}
28. Types
class User
include MongoMapper::Document
key :username, String
key :password , String
end
29. Built-in Types
Array, Binary, Boolean, Date,
Float, Hash, Integer, Nil,
ObjectId, Set, String, Time
30. Custom Types
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
31. Custom Types
class User
include MongoMapper::Document
key :username, String
key :password , String
key :email, DowncasedString
end
32. Custom Types
user = User.new
user.username = "giordano"
user.password = "123"
user.email = "Giordano.Scalzo@CleanCode.it"
user.save
puts User.all.last.to_mongo
35. Embedded Documents
class Task
include MongoMapper::EmbeddedDocument
key :description, String
key :pomodori, Integer
key :is_done, Boolean
end
36. Embedded Documents
class User
include MongoMapper::Document
key :username, String
key :password , String
key :email, DowncasedString
many :tasks
end
37. Embedded Documents
user.tasks << Task.new({
description: 'refactor server',
pomodori: 8,
is_done: false
})
user.tasks << Task.new({
description: 'timer sound',
pomodori: 2,
is_done: false
})
38. Embedded Documents
{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000001'),
"username"=>"giordano", "password"=>"123",
"email"=>"giordano.scalzo@cleancode.it",
"tasks"=>[{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000002'),
"description"=>"refactor server",
"pomodori"=>8, "is_done"=>false
}, {
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000003'),
"description"=>"timer sound",
"pomodori"=>2, "is_done"=>false
}]
}
39. Embedded Documents
{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000001'),
"username"=>"giordano", "password"=>"123",
"email"=>"giordano.scalzo@cleancode.it",
"tasks"=>[{
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000002'),
"description"=>"refactor server",
"pomodori"=>8, "is_done"=>false
}, {
"_id"=>BSON::ObjectId('4d6575e84d8ff692e6000003'),
"description"=>"timer sound",
"pomodori"=>2, "is_done"=>false
}]
}
40. Documents
class Task
include MongoMapper::Document
key :description, String
key :pomodori, Integer
key :is_done, Boolean
end
42. Documents
p User.all.last.tasks
[#<Task _id:
BSON::ObjectId('4d65822b4d8ff69542000002'),
description: "refactor server",
pomodori: 8, is_done: false,
user_id: BSON::ObjectId('4d65822b4d8ff69542000001')
>,
#<Task _id:
BSON::ObjectId('4d65822b4d8ff69542000003'),
description: "timer sound",
pomodori: 2, is_done: false,
user_id: BSON::ObjectId('4d65822b4d8ff69542000001')
>
]
44. Validations & Callbacks
class User
include MongoMapper::Document
key :username, String,
validates_presence_of :username
key :password, String
validates_presence_of :password
end
45. Validations & Callbacks
class User
include MongoMapper::Document
key :username, String, :required => true
key :password, String, :required => true
end
47. Validations & Callbacks
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
50. What about querying?
query = User.where(:last_name.exists => true,
:created_at.gte => from_date,
:created_at.lt => Time.now)
Plucky: ActiveRecord-like language
.skip(0).limit(5)
query.all
51. What about querying?
query = User.where(:last_name.exists => true,
:created_at.gte => from_date,
:created_at.lt => Time.now)
Plucky: ActiveRecord-like language
.skip(0).limit(5)
#<Plucky::Query created_at: {
"$gte"=>"1",
"$lt"=>2011-02-24 10:54:36 UTC},
last_name: {"$exists"=>true}, limit: 5, skip: 0>
52. What about querying?
query = User.where(:last_name.exists => true)
.where(:created_at.gte => from_date)
.where(:created_at.lt => Time.now)
Plucky: ActiveRecord-like language
.skip(0).limit(5)
#<Plucky::Query created_at: {
"$gte"=>"1",
"$lt"=>2011-02-24 10:54:36 UTC},
last_name: {"$exists"=>true}, limit: 5, skip: 0>
54. What about plugins?
Accessible Modifiers
Associations Pagination
Caching Persistence
Callbacks Protected
Clone Querying
Dirty Rails
Document Safe
Dynamic Querying Single
EmbeddedDocument Collection
Equality Inheritance
IdentityMap Scopes
Indexes Serialization
Inspect Timestamps
Keys Userstamps
Logger Validations