active record introduction - 3
DESCRIPTION
Active RecordTRANSCRIPT
![Page 1: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/1.jpg)
ACTIVERECORDRails 3
Sunday, November 13, 11
![Page 2: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/2.jpg)
MVC
Sunday, November 13, 11
![Page 3: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/3.jpg)
MODEL CLASS
in app/models/person.rb
class Message < ActiveRecord::Base
end
Sunday, November 13, 11
![Page 4: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/4.jpg)
EVERY MODELHAS
A CORRESPONDING DATABASE TABLE
Sunday, November 13, 11
![Page 5: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/5.jpg)
MVC
Sunday, November 13, 11
![Page 6: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/6.jpg)
HOW DID WEGET
A DATABASE TABLE?
Sunday, November 13, 11
![Page 7: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/7.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/8.jpg)
DEMO
Sunday, November 13, 11
![Page 9: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/9.jpg)
$ rails new ar_ex
Sunday, November 13, 11
![Page 10: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/10.jpg)
$ rails -v
Sunday, November 13, 11
![Page 11: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/11.jpg)
Edit Gemfile
Sunday, November 13, 11
![Page 12: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/12.jpg)
source 'http://rubygems.org' gem ‘rails’ gem ‘rspec-rails’ gem ‘sqlite3’
Sunday, November 13, 11
![Page 13: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/13.jpg)
$ bundle
Sunday, November 13, 11
![Page 14: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/14.jpg)
$ rails g rspec:install
Sunday, November 13, 11
![Page 15: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/15.jpg)
$ rails g model Message body:text public_key:text
Sunday, November 13, 11
![Page 16: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/16.jpg)
invoke rspec
Sunday, November 13, 11
![Page 17: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/17.jpg)
create spec/models/message_spec.rb
Sunday, November 13, 11
![Page 18: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/18.jpg)
require 'spec_helper'
describe Message do pending "a class in itself"end
Sunday, November 13, 11
![Page 19: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/19.jpg)
invoke active_record
Sunday, November 13, 11
![Page 20: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/20.jpg)
create db/migrate/20110208201036_create_messages.rb
Sunday, November 13, 11
![Page 21: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/21.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/22.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/23.jpg)
drop_table :messages
Sunday, November 13, 11
![Page 24: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/24.jpg)
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements
Sunday, November 13, 11
![Page 25: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/25.jpg)
create app/models/message.rb
Sunday, November 13, 11
![Page 26: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/26.jpg)
class Message < ActiveRecord::Baseend
Sunday, November 13, 11
![Page 27: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/27.jpg)
Where are the methods?
Sunday, November 13, 11
![Page 28: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/28.jpg)
$ rails console
Sunday, November 13, 11
![Page 29: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/29.jpg)
> Message.new
Sunday, November 13, 11
![Page 30: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/30.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/31.jpg)
every model has a corresponding database table
Sunday, November 13, 11
![Page 32: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/32.jpg)
$ rails db
Sunday, November 13, 11
![Page 33: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/33.jpg)
PRAGMA table_info(messages);
Sunday, November 13, 11
![Page 34: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/34.jpg)
nothing!
Sunday, November 13, 11
![Page 35: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/35.jpg)
.quit;
Sunday, November 13, 11
![Page 36: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/36.jpg)
$ rake db:migrate
Sunday, November 13, 11
![Page 37: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/37.jpg)
$ rails db
Sunday, November 13, 11
![Page 38: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/38.jpg)
PRAGMA table_info(messages);
Sunday, November 13, 11
![Page 39: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/39.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/40.jpg)
.quit
Sunday, November 13, 11
![Page 41: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/41.jpg)
$ rails console
Sunday, November 13, 11
![Page 42: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/42.jpg)
> Message.new
Sunday, November 13, 11
![Page 43: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/43.jpg)
=> #<Message id: nil, body: nil, public_key: nil, created_at: nil, updated_at: nil>
Sunday, November 13, 11
![Page 44: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/44.jpg)
>msg = Message.new>msg.body = 2>msg.save>msg
Sunday, November 13, 11
![Page 45: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/45.jpg)
=> #<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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/46.jpg)
> msg.body.class
Sunday, November 13, 11
![Page 47: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/47.jpg)
=> Fixnum
Sunday, November 13, 11
![Page 48: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/48.jpg)
> Message.find(1)
Sunday, November 13, 11
![Page 49: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/49.jpg)
=> #<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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/50.jpg)
> Message.find(1).body.class
Sunday, November 13, 11
![Page 51: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/51.jpg)
=> String
Sunday, November 13, 11
![Page 52: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/52.jpg)
> Message.find(1).updated_at.class
Sunday, November 13, 11
![Page 53: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/53.jpg)
=> ActiveSupport::TimeWithZone
Sunday, November 13, 11
![Page 54: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/54.jpg)
One more time..
Sunday, November 13, 11
![Page 55: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/55.jpg)
$ rails console
Sunday, November 13, 11
![Page 56: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/56.jpg)
> Message.create!
Sunday, November 13, 11
![Page 57: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/57.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/58.jpg)
> exit
Sunday, November 13, 11
![Page 59: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/59.jpg)
Active Record Features
Sunday, November 13, 11
![Page 60: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/60.jpg)
validationshttp://apidock.com/rails/v3.1.0/ActiveModel/Validations
Sunday, November 13, 11
![Page 61: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/61.jpg)
before_save
http://apidock.com/rails/v3.1.0/ActiveRecord/Callbacks
Sunday, November 13, 11
![Page 62: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/62.jpg)
scopeshttp://apidock.com/rails/v3.1.0/ActiveRecord/NamedScope/
ClassMethods/scope
Sunday, November 13, 11
![Page 63: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/63.jpg)
SQL INJECTION
Sunday, November 13, 11
![Page 64: Active Record Introduction - 3](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/64.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052505/554f48bfb4c905423f8b4b31/html5/thumbnails/65.jpg)
QUESTIONS?
Sunday, November 13, 11