ActiveRecordのコマンド一覧
Rails で重要なActiveRecordのコマンドを見直すためメモにしておきました。
まずは、重要な用語として
OR Mapper()
オブジェクト指向プログラミング言語でオブジェクトとリレーショナルデータベース(RDB)の間でデータ形式の相互変換を行うことをOR Mappingと呼び、そのための機能やソフトウェアを「O/Rマッパー」(O/R mapper)という。
→参照。IT 用語辞典
テーブルをオブジェクトに結び付ける |
class オブジェクト名 < ActiveRecord::Base end |
レコードの挿入 |
テーブル名 = オブジェクト名.new テーブル名.データ名 = 値 テーブル名.save |
レコードの挿入2 ※一気にインスタンスを作る方法 |
テーブル名 = オブジェクト名.new(:データ名 => 値, :データ名 => 値) or テーブル名 = オブジェクト名.new(データ名: 値, :データ名: 値) |
レコードの挿入3 newとsaveを同時に行う方法 |
オブジェクト名.create(データ名: 値, :データ名: 値) |
レコードの挿入4 |
テーブル名 = オブジェクト名.new do |ブロック名| ブロック名.データ名 = 値 ブロック名.データ名 = 値 end テーブル名.save |
実際にどのようなSQLが発行されているか確認する |
require 'logger' ActiveRecord::Base.loger = Logger.new(STDOUT) |
データの抽出 |
※全件データの抽出 pp オブジェクト名.all ※データを指定して抽出 pp オブジェクト名.select("データ名, データ名, データ名").all ※特定のレコードだけ抽出 pp オブジェクト名.select("データ名, データ名, データ名").first →最初のレコード pp オブジェクト名.select("データ名, データ名, データ名").first((件数) →最初の何件かのレコード pp オブジェクト名.select("データ名, データ名, データ名").last →最後のレコード |
idを指定してレコードを抽出する方法 |
pp オブジェクト名.select("データ名, データ名, データ名").find(id番号) |
別のデータでレコードを抽出 |
pp オブジェクト名.select("データ名, データ名, データ名").find_by(データ名: 値) pp オブジェクト名.select("データ名, データ名, データ名").find_by データ名: 値 pp オブジェクト名.select("データ名, データ名, データ名").find_by_データ名 値 pp オブジェクト名.select("データ名, データ名, データ名").find_by_データ名 (値) |
データがないときにエラーを返す方法 ’!’ |
pp オブジェクト名.select("データ名, データ名, データ名").find_by_データ名! (値) |
複雑な条件抽出 |
pp オブジェクト名.select("データ名, データ名, データ名").where(条件) ※範囲 .. ※値 [値, 値] ※AND pp オブジェクト名.select("データ名, データ名, データ名").where(条件).where(条件) pp オブジェクト名.select("データ名, データ名, データ名").where(条件 and 条件) ※OR pp オブジェクト名.select("データ名, データ名, データ名").where(条件 or 条件) pp オブジェクト名.select("データ名, データ名, データ名").where(条件).or (オブジェクト名.select("データ名, データ名, データ名").where(条件)) pp オブジェクト名.where(条件).or (オブジェクト名.where(条件)).select("データ名, データ名, データ名") ※NOT pp オブジェクト名.select("データ名, データ名, データ名").where.not(条件) |
変数で管理 ’?’プレースホルダー |
注)変数の値を直接条件の文字列の中には入れない 変数名1 = 値 変数名2 = 値 pp User.select("id, name, age").where("age >= ? and age < ?", 変数1,変数2) pp User.select("id, name, age").where("age >= :変数 and age < :変数", {変数1: 変数1,変数2: 変数2} ) |
like ’%文字’指定文字で終わるもの |
pp User.select("データ名, データ名, データ名").where("データ名 like ?", "%文字") |
並べ替え order desc limit offset |
※値の小さい順 pp User.select("データ名, データ名, データ名"),order("データ名") pp User.select("データ名, データ名, データ名"),order(:データ名) ※その逆 pp User.select("データ名, データ名, データ名"),order("データ名 desc" ) pp User.select("データ名, データ名, データ名"),order(データ名: :desc ) ※データの件数指定 pp User.select("データ名, データ名, データ名"),order(:データ名).limit(件数) ※飛ばして表示 pp User.select("データ名, データ名, データ名"),order(:データ名).limit(件数).offset(飛ばす順番) |
抽出条件の登録 |
class オブジェクト名 < ActiveRecord::Base ※クラスメソッド def self.メソッド名 select("データ名, データ名, データ名"),order(:データ名).limit(件数) end ※スコープ scope :スコープ名, -> { select("データ名, データ名, データ名"),order(:データ名).limit(件数) } end ※呼び出し pp オブジェクト名.メソッド名(スコープ名) |
抽出条件の登録2 引数をとる場合 |
class オブジェクト名 < ActiveRecord::Base ※クラスメソッド def self.メソッド名(仮引数) select("データ名, データ名, データ名"),order(:データ名).limit(仮引数) end ※スコープ scope :スコープ名, ->(仮引数) { select("データ名, データ名, データ名"),order(:データ名).limit(仮引数) } end ※呼び出し pp オブジェクト名.メソッド名(引数)(スコープ名) |
レコードを抽出してもし、なければ作る find_or_create_by |
変数名 = オブジェクト名.find_or_create_by(データ名: 値) ※ないデータを追加する方法 変数名 = オブジェクト名.find_or_create_by(データ名: 値) do |ブロック名| ブロック名.データ名 = 値 end |
レコードの更新 update |
※idを使う場合(複数のデータを一気に更新することもできる) オブジェクト名.update(id, データ名: 値) ※id以外でレコードを指定する場合 オブジェクト名.where(データ名: 値).update(データ名: 値) ※複数のレコードを一気に更新する オブジェクト名.where(条件).update(データ名: 値) |
update_all |
オブジェクト名.where(条件).update_all(データ:の演算) ※Validationなどは使えず単にデータを更新するだけ |
データの削除 delete destroy |
※delete 単機能・高速 オブジェクト名.delete(id) オブジェクト名.where(条件).delete_all ※destroy 高機能・低速 destroy 1件削除 destroy_all 全件削除 |
レコードの更新や挿入の際にルールを付け加えられる validation |
class オブジェクト名 < ActiveRecord::Base validate :データ名, :データ名, presence: true validate :データ名, ルールのキーワード: { 条件 } end |
エラーメッセージの取得 if |
if エラーが出そうな処理 pp テーブル名.errors.messages end |
特定の処理が行われる前後で自動的に何らかの処理をかませる callback |
※before_destroy, after_destroy class オブジェクト名 < ActiveRecord::Base before_destroy :print_before_message after_destroy :print_after_message end protected def print_before_msg 処理名 end |
複数のオブジェクトを関連付けて扱う仕組み Association |
class オブジェクト名1 < ActiveRecord::Base ※メインのテーブル(テーブル1) has_many :comments end class オブジェクト名 2< ActiveRecord::Base ※付帯するテーブル (テーブル2) belongs_to :user end テーブル1 = オブジェクト名.includes(:テーブル2).find(1) pp テーブル1.テーブル2 |
関連するオブジェクトを削除する時 |
※オブジェクト1が削除されるときに関連するオブジェクトも削除してもらう方法 class オブジェクト名1 < ActiveRecord::Base ※メインのテーブル(テーブル1) has_many :comments dependent: destroy end オブジェクト1.find(1).destroy |
文字にすると意外にわかりづらいですね。コマンドを書く際に思い出せないときのメモとして使用していきます。