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 の関連付け (アソシエーション) あたりが難しかったので要復習

railsguides.jp