Object Relational Mappers
Map database contents to Ruby objects
There are lots of reasons, most of them historical, why SQL reads weird, and it’s quite unlikely that SQL will become a more pleasant language, or replaced anytime soon.
For this reason programmers have written lots and lots of tools (libraries), which make talking to, and working with relations databases a little bit easier.
One class of such tools is called ORM: Object Relational Mappers.
An ORM is a library that “maps” data, stored in a database, to objects, and
usually has methods such as save
, in order to save an object as a database
row, create
to insert new data, update
to change it, and so on. In other
words, they usually provide a DSL for working with the
database.
Your data is stored in the database as rows, because that’s what databases do. However in your Ruby application (or whatever language you use for this) you would see, and use this data as objects: because that’s what Ruby is great at. The ORM is a tool that transforms your database data to Ruby objects and vice versa.
Does that make sense?
Let’s look at an example.
If we have a database table members
like this:
id | name | joined_on |
---|---|---|
1 | Anja | 2013-06-23 |
2 | Carla | 2013-06-24 |
3 | Rebecca | 2013-06-31 |
Then in our Ruby code, using an ORM, we could communicate with it like so:
class Member # we'd need to somehow include the ORM functionality
end
# Find one member
member = Member.find(id: 1)
puts "#{member.name} has joined on #{member.joined_on}."
# Change the member's joined_on date:
member.joined_on = '2013-06-24'
member.save
puts
puts "Correction!"
member = Member.find(id: 1)
puts "#{member.name} has joined on #{member.joined_on}."
# Find several members based on their joined_on date:
puts
puts "Who joined on 2013-06-24?"
members = Member.where(joined_on: '2013-06-24')
members.each do |member|
puts "#{member.name} has joined on #{member.joined_on}."
end
And this would output:
Anja has joined on 2013-06-23.
Correction!
Anja has joined on 2013-06-24.
Who joined on 2013-06-24?
Anja has joined on 2013-06-24.
Carla has joined on 2013-06-24.
Of course the details of this Ruby code might vary, depending on the concrete ORM tool that we are using.
But the basic idea is that we can use Ruby classes and objects to retrieve some
data from the database (as in Member.find(id: 1)
), which would then appear in
our application as a normal Ruby object. We can call methods to look up fields
(such as in member.name
, which returns the value from the name
column).
And we can use the same object to modify, and save the data back to the
database.
Two widely used ORMs in Ruby are ActiveRecord, which is part of Rails, and Sequel, which is more modern, slick, and performant.
Since you will anyway get to know ActiveRecord later when you learn Rails, we will introduce Sequel first. This way you will get to know two libraries and can later compare them.
You can install the Sequel gem like so:
$ gem install sequel