active record introduction - 3
DESCRIPTION
Active RecordTRANSCRIPT
ACTIVERECORDRails 3
Sunday, November 13, 11
MVC
Sunday, November 13, 11
MODEL CLASS
in app/models/person.rb
class Message < ActiveRecord::Base
end
Sunday, November 13, 11
EVERY MODELHAS
A CORRESPONDING DATABASE TABLE
Sunday, November 13, 11
MVC
Sunday, November 13, 11
HOW DID WEGET
A DATABASE TABLE?
Sunday, November 13, 11
RUBY-DRIVEN SCHEMA
• scaffold generatesdb/migrate/20110131021702_create_people.rb
• rake db:migrate runs the migration, creates the table
•
Sunday, November 13, 11
DEMO
Sunday, November 13, 11
$ rails new ar_ex
Sunday, November 13, 11
$ rails -v
Sunday, November 13, 11
Edit Gemfile
Sunday, November 13, 11
source 'http://rubygems.org' gem ‘rails’ gem ‘rspec-rails’ gem ‘sqlite3’
Sunday, November 13, 11
$ bundle
Sunday, November 13, 11
$ rails g rspec:install
Sunday, November 13, 11
$ rails g model Message body:text public_key:text
Sunday, November 13, 11
invoke rspec
Sunday, November 13, 11
create spec/models/message_spec.rb
Sunday, November 13, 11
require 'spec_helper'
describe Message do pending "a class in itself"end
Sunday, November 13, 11
invoke active_record
Sunday, November 13, 11
create db/migrate/20110208201036_create_messages.rb
Sunday, November 13, 11
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
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
drop_table :messages
Sunday, November 13, 11
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements
Sunday, November 13, 11
create app/models/message.rb
Sunday, November 13, 11
class Message < ActiveRecord::Baseend
Sunday, November 13, 11
Where are the methods?
Sunday, November 13, 11
$ rails console
Sunday, November 13, 11
> Message.new
Sunday, November 13, 11
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
every model has a corresponding database table
Sunday, November 13, 11
$ rails db
Sunday, November 13, 11
PRAGMA table_info(messages);
Sunday, November 13, 11
nothing!
Sunday, November 13, 11
.quit;
Sunday, November 13, 11
$ rake db:migrate
Sunday, November 13, 11
$ rails db
Sunday, November 13, 11
PRAGMA table_info(messages);
Sunday, November 13, 11
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
.quit
Sunday, November 13, 11
$ rails console
Sunday, November 13, 11
> Message.new
Sunday, November 13, 11
=> #<Message id: nil, body: nil, public_key: nil, created_at: nil, updated_at: nil>
Sunday, November 13, 11
>msg = Message.new>msg.body = 2>msg.save>msg
Sunday, November 13, 11
=> #<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
> msg.body.class
Sunday, November 13, 11
=> Fixnum
Sunday, November 13, 11
> Message.find(1)
Sunday, November 13, 11
=> #<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
> Message.find(1).body.class
Sunday, November 13, 11
=> String
Sunday, November 13, 11
> Message.find(1).updated_at.class
Sunday, November 13, 11
=> ActiveSupport::TimeWithZone
Sunday, November 13, 11
One more time..
Sunday, November 13, 11
$ rails console
Sunday, November 13, 11
> Message.create!
Sunday, November 13, 11
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
> exit
Sunday, November 13, 11
Active Record Features
Sunday, November 13, 11
validationshttp://apidock.com/rails/v3.1.0/ActiveModel/Validations
Sunday, November 13, 11
before_save
http://apidock.com/rails/v3.1.0/ActiveRecord/Callbacks
Sunday, November 13, 11
scopeshttp://apidock.com/rails/v3.1.0/ActiveRecord/NamedScope/
ClassMethods/scope
Sunday, November 13, 11
SQL INJECTION
Sunday, November 13, 11
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
QUESTIONS?
Sunday, November 13, 11