ruby on rails

Download Ruby on Rails

If you can't read please download the document

Upload: aizat-faiz

Post on 16-Apr-2017

12.602 views

Category:

Technology


0 download

TRANSCRIPT

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