Active Record入門 ドットインストール をやってみた備忘録メモ
Active Recordとは
- OR Mapper (OR Mapper の O は Object、R は Relational database のこと)
- マッピングすることによって、SQL を意識せずに Ruby のオブジェクトのようにデータベースを簡単に扱うことができる
- 例えば、users テーブルのレコードをUserクラスのインスタンスとして扱えるようになる。
class User < ActiveRecord::Base end
バリデーション
- 入力値チェック。レコードを挿入したり更新したりする時に、ルールを付けることができる仕組み
- 以下の例は、空白を防ぐ。nameは3文字以上
class User < ActiveRecord::Base validate :name,:age,presence: true validate :name, length: {minimum: 3} end
コールバック
- callbackの種類は他にもいくつかあり、何らかの処理の前後で特定の処理をしたい場合に使う。
- ActiveRecordで定義されてる
- before_destoryってのと
- after_destroyってのが
- 以下の例は、レコードが削除される前後で標準出力する
require 'active_record' require 'pp' require 'logger' Time.zone_default = Time.find_zone! 'Tokyo' ActiveRecord::Base.default_timezone = :local ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./myapp.db" ) class User < ActiveRecord::Base before_destroy :print_before_msg after_destroy :print_after_msg protected def print_before_msg puts "#{self.name} will be deleted" end def print_after_msg puts "#{self.name} deleted" end end User.delete_all User.create(name: "taka",age: 33) User.create(name: "masa",age: 44) User.create(name: "mari",age: 53) User.create(name: "taro",age: 23) User.create(name: "maki",age: 13) User.create(name: "mika",age: 29) User.where("age >= 20").destroy_all
- 実行結果
$ bundle exec ruby main.rb taka will be deleted taka deleted masa will be deleted masa deleted mari will be deleted mari deleted taro will be deleted taro deleted mika will be deleted mika deleted
アソシエーション
- 複数のテーブル(オブジェクト)を関連づける仕組み
- 例えば、
- ユーザーが複数のコメントをもつという関係
- has_many :comments
- コメントからすると、一つのユーザーに属する関係
- belongs_to :user
- ユーザーが複数のコメントをもつという関係
require 'active_record' require 'pp' Time.zone_default = Time.find_zone! 'Tokyo' ActiveRecord::Base.default_timezone = :local ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./myapp.db" ) class User < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :user end User.delete_all User.create(name: "taka",age: 33) User.create(name: "masa",age: 44) User.create(name: "mari",age: 53) User.create(name: "taro",age: 23) User.create(name: "maki",age: 13) User.create(name: "mika",age: 29) Comment.delete_all Comment.create(user_id: 1,body: "hello01") Comment.create(user_id: 1,body: "hello02") Comment.create(user_id: 2,body: "hello03") comments = Comment.all comments.each do |c| puts "#{c.body} by #{c.user.name}" end
- 実行結果
$ bundle exec ruby main.rb hello01 by taka hello02 by taka hello03 by masa
アソシエーション(削除)
- 例えば、ユーザーを削除して、関連するコメントを一緒に削除したい場合
class User < ActiveRecord::Base has_many :comments, dependent: :destroy end
感想
Active Record の関連付け (アソシエーション) あたりが難しかったので要復習