Rails 一日一つメソッド (Day43) Active Record(1)
Rails 一日一つメソッド (Day43) Active Record(1)
1. Active Recordとは
- Active Recordは、MVCで M(Model )で、モデルに相当するもの。
- データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにする。
- ORM(Object Relational Mapping ) systemに記述されている ActiveRecord Pattenを実装してもので、このパタンと同じ名前が付けられている。
ActiveRecordの役割は、Modelを通じてDataBaseとRubyオブジェクトの接続を提供する。(各Modelは、DataBase Tableの一行を表し、Modelの属性はtableの列とマッピングされる)
2. Active Recordのモデルを作成する
class User < ApplicationRecord
end
- User Modelを作成し、DataBaseの Users Tableにマッピングされ、Tableに含まれている各行のカラムを、作成したモデルのインスタンスの属性にマッピングする。
Create Table users (
id int(255) Not Null auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
- SQL文で User Tableを作成する。
- idと nameという二つのカラムがtableが宣言され、二つのパラメータを持つ特定の一つのnameを表す。
user = User.new
User.name = "AR"
puts user.name
# "AR"
3. ActiveRecord命名ルール
- ActiveRecordは、ActiveRecord::Baseを継承しているので、使うべきtable名を ActiveRecord::Base.table_name=メソッドで明示的に指定できる。
class User < ApplicationRecord
self.table_name = "nick_name"
end
4. CRUD Dataの読み書き
1) Create
- User Modelに nameと nick_name属性がある時、createメソッドで新しいレコードが1件作成され、DataBaseに保存される。
user = User.create(name: "arang", nick_name: "AR")
- new メソッドでインスタンスを作成する場合、オブジェクトは保存されない。
user = User.new
user.name = "arang"
user.nick_name = "AR"
- この場合、user.saveを実行して初めてDataBaseにレコードが commitされる。
- そして、createや newにブロックを渡すと、そのブロックで初期化された新しいオブジェクトが yieldされる。
user = User.new do |u|
u.name = "arang"
u.nick_name = "AR"
end
2) Read
- ActiveRecordでは、DataBase内の DataにアクセスできるAPIを提供する。
# 全てのUserの返す
users = User.all
# 最初のUserを返す
user = user.first
# arangという名前を探す
arang = User.find_by(name: "arang")
# 名前が arangで、性別が男の全てを返し、created_atカラムで逆順に sortする
users = User.where(name: 'arang', gender: '男').order('created_at DESC')
3) Update
- Active Recordオブジェクトを取得すると、オブジェクトの属性を変更してデータベースに保存できるようになる。
user = User.find_by(name: 'arang)
user.name = 'Arang'
user.save
user = User.find_by(name: 'arang')
user.update(name: 'Arang')
4) Delete
- Active Recordオブジェクトを取得すると、そのオブジェクトをdestroyしてデータベースから削除できる。
# Arang Userを検索し削除する
User.destroy_by(name: 'Arang')
# 全Userを削除する
User.destroy.all