65
ACTIVERECORD Rails 3 Sunday, November 13, 11

Active Record Introduction - 3

Embed Size (px)

DESCRIPTION

Active Record

Citation preview

Page 1: Active Record Introduction - 3

ACTIVERECORDRails 3

Sunday, November 13, 11

Page 2: Active Record Introduction - 3

MVC

Sunday, November 13, 11

Page 3: Active Record Introduction - 3

MODEL CLASS

in app/models/person.rb

class Message < ActiveRecord::Base

end

Sunday, November 13, 11

Page 4: Active Record Introduction - 3

EVERY MODELHAS

A CORRESPONDING DATABASE TABLE

Sunday, November 13, 11

Page 5: Active Record Introduction - 3

MVC

Sunday, November 13, 11

Page 6: Active Record Introduction - 3

HOW DID WEGET

A DATABASE TABLE?

Sunday, November 13, 11

Page 7: Active Record Introduction - 3

RUBY-DRIVEN SCHEMA

• scaffold generatesdb/migrate/20110131021702_create_people.rb

• rake db:migrate runs the migration, creates the table

Sunday, November 13, 11

Page 8: Active Record Introduction - 3

DEMO

Sunday, November 13, 11

Page 9: Active Record Introduction - 3

$ rails new ar_ex

Sunday, November 13, 11

Page 10: Active Record Introduction - 3

$ rails -v

Sunday, November 13, 11

Page 11: Active Record Introduction - 3

Edit Gemfile

Sunday, November 13, 11

Page 12: Active Record Introduction - 3

source 'http://rubygems.org' gem ‘rails’ gem ‘rspec-rails’ gem ‘sqlite3’

Sunday, November 13, 11

Page 13: Active Record Introduction - 3

$ bundle

Sunday, November 13, 11

Page 14: Active Record Introduction - 3

$ rails g rspec:install

Sunday, November 13, 11

Page 15: Active Record Introduction - 3

$ rails g model Message body:text public_key:text

Sunday, November 13, 11

Page 16: Active Record Introduction - 3

invoke rspec

Sunday, November 13, 11

Page 17: Active Record Introduction - 3

create spec/models/message_spec.rb

Sunday, November 13, 11

Page 18: Active Record Introduction - 3

require 'spec_helper'

describe Message do pending "a class in itself"end

Sunday, November 13, 11

Page 19: Active Record Introduction - 3

invoke active_record

Sunday, November 13, 11

Page 20: Active Record Introduction - 3

create db/migrate/20110208201036_create_messages.rb

Sunday, November 13, 11

Page 21: Active Record Introduction - 3

class CreateMessages < ActiveRecord::Migration def self.change # rake db:migrate end def self.up # rake db:migrate end def self.down # rake db:migrate:down VERSION=file_name # rake db:migrate:redo VERSION=file_name endend

Sunday, November 13, 11

Page 22: Active Record Introduction - 3

create_table :messages do |t| t.text :body t.text :public_key

t.timestamps end

rails g model Message body:text public_key:textSunday, November 13, 11

Page 23: Active Record Introduction - 3

drop_table :messages

Sunday, November 13, 11

Page 25: Active Record Introduction - 3

create app/models/message.rb

Sunday, November 13, 11

Page 26: Active Record Introduction - 3

class Message < ActiveRecord::Baseend

Sunday, November 13, 11

Page 27: Active Record Introduction - 3

Where are the methods?

Sunday, November 13, 11

Page 28: Active Record Introduction - 3

$ rails console

Sunday, November 13, 11

Page 29: Active Record Introduction - 3

> Message.new

Sunday, November 13, 11

Page 30: Active Record Introduction - 3

ActiveRecord::StatementInvalid:

Could not find table 'messages'

from /Users/o_o/.rvm/gems/ruby-1.9.2-p0@rails3/gems/activerecord-3.0.3/lib/active_record/connection_adapters/sqlite_adapter.rb:295:in `table_structure'

Sunday, November 13, 11

Page 31: Active Record Introduction - 3

every model has a corresponding database table

Sunday, November 13, 11

Page 32: Active Record Introduction - 3

$ rails db

Sunday, November 13, 11

Page 33: Active Record Introduction - 3

PRAGMA table_info(messages);

Sunday, November 13, 11

Page 34: Active Record Introduction - 3

nothing!

Sunday, November 13, 11

Page 35: Active Record Introduction - 3

.quit;

Sunday, November 13, 11

Page 36: Active Record Introduction - 3

$ rake db:migrate

Sunday, November 13, 11

Page 37: Active Record Introduction - 3

$ rails db

Sunday, November 13, 11

Page 38: Active Record Introduction - 3

PRAGMA table_info(messages);

Sunday, November 13, 11

Page 39: Active Record Introduction - 3

0|id|INTEGER|1||11|body|text|0||02|public_key|text|0||03|created_at|datetime|0||04|updated_at|datetime|0||0

Sunday, November 13, 11

Page 40: Active Record Introduction - 3

.quit

Sunday, November 13, 11

Page 41: Active Record Introduction - 3

$ rails console

Sunday, November 13, 11

Page 42: Active Record Introduction - 3

> Message.new

Sunday, November 13, 11

Page 43: Active Record Introduction - 3

=> #<Message id: nil, body: nil, public_key: nil, created_at: nil, updated_at: nil>

Sunday, November 13, 11

Page 44: Active Record Introduction - 3

>msg = Message.new>msg.body = 2>msg.save>msg

Sunday, November 13, 11

Page 45: Active Record Introduction - 3

=> #<Message id: 1, body: 2, public_key: nil, created_at: "2011-02-08 20:56:33", updated_at: "2011-02-08 20:56:33">

Sunday, November 13, 11

Page 46: Active Record Introduction - 3

> msg.body.class

Sunday, November 13, 11

Page 47: Active Record Introduction - 3

=> Fixnum

Sunday, November 13, 11

Page 48: Active Record Introduction - 3

> Message.find(1)

Sunday, November 13, 11

Page 49: Active Record Introduction - 3

=> #<Message id: 1, body: "2", public_key: nil, created_at: "2011-02-08 20:56:33", updated_at: "2011-02-08 20:56:33">

Sunday, November 13, 11

Page 50: Active Record Introduction - 3

> Message.find(1).body.class

Sunday, November 13, 11

Page 51: Active Record Introduction - 3

=> String

Sunday, November 13, 11

Page 52: Active Record Introduction - 3

> Message.find(1).updated_at.class

Sunday, November 13, 11

Page 53: Active Record Introduction - 3

=> ActiveSupport::TimeWithZone

Sunday, November 13, 11

Page 54: Active Record Introduction - 3

One more time..

Sunday, November 13, 11

Page 55: Active Record Introduction - 3

$ rails console

Sunday, November 13, 11

Page 56: Active Record Introduction - 3

> Message.create!

Sunday, November 13, 11

Page 57: Active Record Introduction - 3

SQL (0.3ms) SELECT name FROM sqlite_master WHERE type = 'table' AND NOT name = 'sqlite_sequence'

AREL (0.5ms) INSERT INTO "messages" ("body", "public_key", "created_at", "updated_at") VALUES (NULL, NULL, '2011-02-09 01:55:09.111181', '2011-02-09 01:55:09.111181')

Sunday, November 13, 11

Page 58: Active Record Introduction - 3

> exit

Sunday, November 13, 11

Page 59: Active Record Introduction - 3

Active Record Features

Sunday, November 13, 11

Page 60: Active Record Introduction - 3

validationshttp://apidock.com/rails/v3.1.0/ActiveModel/Validations

Sunday, November 13, 11

Page 61: Active Record Introduction - 3

before_save

http://apidock.com/rails/v3.1.0/ActiveRecord/Callbacks

Sunday, November 13, 11

Page 63: Active Record Introduction - 3

SQL INJECTION

Sunday, November 13, 11

Page 64: Active Record Introduction - 3

SAFE FROM SQL INJECTIONclass User < ActiveRecord::Base

def self.authenticate_unsafely(user_name, password) find(:first, :conditions =>

"user_name = '#{user_name}' AND password = '#{password}'")

end

def self.authenticate_safely(user_name, password)

find(:first, :conditions => [ "user_name = ? AND password = ?", user_name, password ])

end

def self.authenticate_safely_simply(user_name, password)

find(:first, :conditions =>

{ :user_name => user_name, :password => password })

end

Sunday, November 13, 11

Page 65: Active Record Introduction - 3

QUESTIONS?

Sunday, November 13, 11