If you can't read please download the document
Upload
aizat-faiz
View
12.602
Download
0
Embed Size (px)
Citation preview
Ruby on RailsBy Miguel [email protected]://www.upstrat.com/
and Ezwan Aizat bin Abdullah [email protected]://rails.aizatto.com/
http://creativecommons.org/licenses/by/3.0/
Who Am I?
Miguel Vega
1 years doing Ruby and Rails
PHP before then
Started a company (upstrat) just to have an excuse to use rails.
Who Am I?
Multiple Names
Ezwan Aizat Bin Abdullah Faiz
Aizat Faiz
aizatto
That scrubby looking guy on the screen
Student
Free and Open Source (FOSS) Enthusiast
Local FOSS Champion
http://foss.org.my
Web Developer
Ruby on Rails
LAMP
What is
Ruby on Rails?
Built on
Ruby Programming Language
Web Application Framework
+
=
Wait!
Unexpected
Side Effect!
YOU =
Why Ruby?
A great man once said
Often people, especially computer engineers, focus on the machines.
They think,
By doing this, the machine will run faster.
By doing this, the machine will run more effectively.
By doing this, the machine will something something something
They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines.
We are the masters. They are the slaves.
By doing this,
the machine will something something something
We are the masters,
they are the slaves
Yukihiro Matsumoto
Creator of Ruby
They are the SLAVES!
and I think we keep forgetting that
Ruby brings...
Large Increase in Productivity
How?
Non traditional programming style
Everything is an Object
string = String.new
5.times doputs "Hello World"end# Hello World# Hello World# Hello World# Hello World# Hello World
Everything is an Object
1.upto(100) { |i| puts i }# 1# 2# 3# ...# 1003.141_592_65.ceil# 42.71828182845905.floor# 2
Blocks (aka Closures)
patients.each do |patient| if patient.ill? physician.examine patient else patient.jump_for_joy! endend
Blocks (aka Closures)
hello = Proc.new do |string| puts "Hello #{string.upcase}"endhello.call 'Aizat'# Hello AIZAThello.call 'World'# Hello WORLD
Open Classes
class String def sanitize self.gsub(/[^a-z1-9]+/i, '_') endend
puts "Ruby gives you alot of $$$ yo!".sanitize# Ruby_gives_you_alot_of_yo_
Open Classes
class Array def rand self[Kernel::rand(size)] endend
puts %w[a b c d e f g].rand# "e"
Open Classes
class Array def shuffle size.downto(1) { |n| push delete_at(Kernel::rand(n)) } self endend
puts %w[a b c d e f g].shuffle.inspect# ["c", "e", "f", "g", "b", "d", "a"]
Open Classes
class Numeric def seconds self end
def minutes self.seconds * 60 end
def hours self.minutes * 60 end
def days self.hours * 24 end
def weeks self.days * 7 end
alias second seconds alias minute minutes alias hour hours alias day days alias week weeksend
Open Classes
1.second# 11.minute# 607.5.minutes# 450.03.hours# 1080010.75 hours# 3870024.hours# 8640031.days# 2678400
51.weeks# 30844800365.days# 31536000
Time.now# Thu May 10 12:10:00 0800 2007Time.now - 5.hours# Thu May 10 07:10:00 0800 2007Time.now - 3.days# Mon May 07 12:10:00 0800 2007Time.now - 1.week# Thu May 03 12:10:00 0800 2007
This is how Rails does its magic
and more...
What is Rails?
Convention over Configuration
MVC
Model View Controller
MVC
Model View Controller
ActiveRecord
Object Relation Mapping (ORM)
Class to Table, Object to Row
CRUD simple
Database Agnostic
ActiveRecord
ActiveRecord::Base#find
class Patient < ActiveRecord::Baseend
Patient.find(1)# SELECT * FROM patients WHERE id = 1
Patient.find_by_name 'Miguel Vega'# SELECT * FROM patients WHERE name = 'Miguel Vega'
Patient.find_by_date_of_birth '1986-07-24'# SELECT * FROM patients WHERE date_of_birth = '1986-07-24'
Patient.find_by_name_and_date_of_birth 'Miguel Vega', '1986-07-24'# SELECT * FROM patients WHERE name = 'Miguel Vega' AND date_of_birth = '1986-07-24'
ActiveRecord::Base#find
Patient.count# SELECT COUNT(*) AS count
Patient.find :all, :order => 'name DESC'# SELECT * FROM patients ORDER BY name DESC
Patient.find :all, :conditions => ["name LIKE ?", "The other guy"]# SELECT * FROM patients WHERE name = 'The other guy'
Models
class Patient < ActiveRecord::Baseend
class Encounter < ActiveRecord::Baseend
class Physican < ActiveRecord::Baseend
Associations
class Patient < ActiveRecord::Base has_many :encounters has_many :physicans, :through => :encountersend
class Encounter < ActiveRecord::Base belongs_to :patient belongs_to :physicianend
class Physican < ActiveRecord::Base has_many :encounters has_many :patients, :through => :encountersend
Smart Defaults
class Patient < ActiveRecord::Base has_many :encounters, :class_name => 'Encounter', :foreign_key => 'patient_id' has_many :physicans, :through => :encounters, :class_name => 'Physician', :foreign_key => 'physician_id'end
class Encounter < ActiveRecord::Base belongs_to :patient, :class_name => 'Patient', :foreign_key => 'patient_id' belongs_to :physician, :class_name => 'Physician', :foreign_key => 'physician_id'end
class Physican < ActiveRecord::Base has_many :encounters, :class_name => 'Encounter', :foreign_key => 'patient_id' has_many :patients, :through => :encounters, :class_name => 'Patient', :foreign_key => 'patient_id'end
Or what people like to callConvention over Configuration
Associations
p = Patient.find :first# SELECT * FROM patients LIMIT 1p.encounters.count# SELECT COUNT(*) AS count FROM encounters WHERE (patient_id = 1)p.encounters.find :condition => ['date