自分の手で未来を創るーlav0

自分のために、誰かのために、今ここにないもの、もっと良くしたいもの、何でも自分の手で創っていく。そして、作ったものを公開していきます

ActiveRecordのコマンド一覧

Rails で重要なActiveRecordのコマンドを見直すためメモにしておきました。

f:id:kslabo51:20191217222003j:plain

 

 

まずは、重要な用語として

 

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



文字にすると意外にわかりづらいですね。コマンドを書く際に思い出せないときのメモとして使用していきます。