Objectify is a Ruby library written to facilitate object oriented development (object-relational mapping, or ORM). Using Objectify, developers can treat relational databases and their contents as objects, allowing more a more Ruby-like development experience.
Find out more about the other on his homepage, LinkedIn or AngelList.
# Get information about your table, including table and column names
class House < SQLObject
end
House.finalize!
House.table_name
# => :houses
::columns
House.columns
# => [:id, :owner_id, :address]
# Find individual records by their id or by their attributes
House.find(1) # => <House:0x007ffe4c8eaaa8 @attributes={:id=>1, :address=>"1 Main St"}>
House.where(address: "1 Main St") # => <House:0x007ffe4c8eaaa8 @attributes={:id=>1, :address=>"1 Main St"}>
# Find all records
House.all
# => [
<House:0x007ffe4c8eaaa8 @attributes={:id=>1, :address=>"1 Main St", :owner_id=>3}>,
<House:0x034ffe3c0e4a38 @attributes={:id=>2, :address=>"3 Pine St", :owner_id=>3}>
]
# Stage records before saving them to the database
home = House.new(address: "7 Grove Ave", owner_id: 1)
# Save staged records to the database
home.save
# Update records on the spot
home.update(address: "3 Maple Blvd")
class House < SQLObject
belongs_to :owner
has_one_through :occupying_family, :owner, :family
end
House.finalize!
class Owner < SQLObject
has_many :houses
belongs_to :family
end
Owner.finalize!
home = House.find(3)
home.owner
# => <Owner:0x007err483f32dk @attributes={:id=>1, :name=>"Peter Macdougal", :family_id=>2}>
N.B. the has_one_through
association requires the user to specify the association upon which it depends as well as the association specified (e.g. the :family
to which the :owner
belongs)
-
Download this repo into your project library
-
Model any tables you want to use as Ruby classes (e.g. an :apartments table should be modeled as an "Apartment" class)
-
Require SQLObject at the top of each model file
-
Each object model should inherit from SQLObject (which was included at the top of the file)
class House < SQLObject
belongs_to :owner
has_one_through :occupying_family, :owner, :family
end
N.B. call ::finalize!
on a class after defining it to make use of getter and setter methods.
House.finalize! # => makes getters and setters available on column names
Create a new record or update a records attributes
house = House.new(address: "5 Elm Street", owner_id=2)
house.save
house.address = "2 Marble Road"
house.save
Query the database for records with desired attributes:
House.where(address: "1 Main St")
# => <House:0x007ffe4c8eaaa8 @attributes={:id=>1, :address=>"1 Main St"}>
Access associated records directly with association methods:
home = House.find(3)
# => <House:0x007ffe4c8eaaa8 @attributes={:id=>3, :address=>"1 Granite St", :owner_id=>1}>
home.owner
# =><Owner:0x007err483f32dk @attributes={:id=>1, :name=>"Peter Macdougal", :family_id=>2}>
This library was written entirely in Ruby, using ActiveSupport to simplify string manipulation for naming conventions.