Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

Latest commit

 

History

History
324 lines (223 loc) · 4.99 KB

about-activerecord.md

File metadata and controls

324 lines (223 loc) · 4.99 KB

ActiveRecord


ここでやること

  • ActiveRecordの概要
    • ActiveRecordとは?
    • 「設定より規約」
  • コードで紹介
    • Modelの作り方
    • CRUC操作
    • Validations
    • Migrations

ActiveRecordとは?

Martin Fowler氏 が定義した

Active Record Pattern に由来します

MVCパターンの Model を担当するもので

Rails にて O/Rマッパー として利用されてるのは有名ですね


Active Record Pattern:

An object that wraps a row in a database table or view,

capsulates the database access, and adds domain logic on that data.

--

データベースのテーブルあるいはビューの row が

1つのクラスにラップされ

オブジェクトのインスタンスがデータベースの1行に結合される

DBアクセスをカプセル化し、

ドメインロジックも追加できる


ActiveRecord でできること

--

Modelやそのデータを表すこと

Model間のリレーションを表すこと

関係するモデルの継承関係を表すこと

DBに永続化する前にModelをバリデーションすること

オブジェクト指向っぽくDB操作すること


設定より規約

Convention over Configuration

画像の参考:[Active Record Associations — Ruby on Rails Guides](http://guides.rubyonrails.org/association_basics.html)

名前の規約

Orderクラスは orders テーブル

スキーマの規約

外部キーは table_name_id

主キーはデフォルトで id 等


コードで理解していきましょう! :)


サンプルコード用意しました

$ ce /path/to/workspace
$ git clone https://github.com/luckypool/activerecord-example.git
$ cd activerecord-example
$ bundle install

やってみよう

$ rake db:migrate
$ bundle exec ruby crud.rb
pryが起動しますので `step` や `next` で進めていきましょう `tail -f db/database.log` したり `sqlite3 db/sample.sqlite3` でデータ覗いてみましょう

補足


Modelの作り方

users テーブルがあったとして、

CREATE TABLE users (
   id int(11) NOT NULL auto_increment,
   name varchar(255),
   PRIMARY KEY  (id)
);

これに対応する Model の作り方はとても簡単

# models/user.rb
class User < ActiveRecord::Base
end

CRUD 操作 (create)

user = User.create(name: "David")

or

user = User.new
user.name = "David"
user.save

or

user = User.new do |u|
  u.name = "David"
end
user.save

means

INSERT INTO users (name) VALUES ("David");

CRUD 操作 (read)

全件取得

users = User.all

means

SELECT * FROM users

1件取得

users = User.find_by(id: 1)

means

SELECT * FROM users WHERE id = 1 LIMIT 1

CRUD 操作 (update)

user = User.find_by(id: 1)
user.name = 'Dave'
user.save

or

user = User.find_by(id: 1)
user.update(name: 'Dave')

means

UPDATE users SET name = 'Dave' WHERE id = 1

CRUD 操作 (delete)

user = User.find_by(id: 1)
user.destroy

means

DELETE FROM users WHERE id = 1

Validations

# models/user.rb
class User < ActiveRecord::Base
  validates :name, presence: true
end
User.create  # => false
User.create! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
詳しくは

Active Record Validations — Ruby on Rails Guides

Active Record Callbacks — Ruby on Rails Guides


Migrations

# db/migrate/20140411074321_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end
end
CREATE TABLE "users" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "name" varchar(255),
  "created_at" datetime,
  "updated_at" datetime
);
詳しくは [Active Record Migrations — Ruby on Rails Guides](http://guides.rubyonrails.org/migrations.html)

ここでやったこと

  • ActiveRecordの概要
    • ActiveRecordとは?
    • 「設定より規約」
  • 簡単チュートリアル
    • Modelの作り方
    • CRUC操作
    • Validations
    • Migrations

ActiveRecord

おわり

--

Rails Guides

Ruby on Rails3で学ぶWeb開発のキホン(3)