モデル(model)

モデルについて

モデルとは

データベースの情報を操作する仕組み

モデル名とテーブル名の規約

  • 英大文字から始まる
  • 英数字のみ
  • 単語の区切りでは、先頭文字を大文字
  • 単数形の名詞
    Entry
    UserComment
  • ファイルはapp/modelsディレクトリに格納
  • ファイル名は、モデル名の単語区切りを「_」にし、すべて小文字にしたもの
    app/models/entry.rb<br />app/models/user_comment.rb

命名規則

種類説明
モデルクラス名先頭は大文字で単数形User
モデルのファイル名先頭は小文字で単数形user.rb
テーブル名先頭は小文字で複数形users
テストスクリプト名xxx_test.rbuser_test.rb

モデルを生成(new/build)

new

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

モデルオブジェクトを生成する。
保存はまだされていないため、saveメソッドなどを使って保存する。
生成と同時に保存したい場合は、createメソッドを使用する。

使い方
モデル.new([属性])
モデルオブジェクトを生成
user = User.new
属性を設定してモデルオブジェクトを生成(Ruby1.8 & 1.9)
user = User.new(:name => "tarou")
属性を設定してモデルオブジェクトを生成(Ruby1.9)
user = User.new(name: "tarou")
ソースコード検索

build

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

newメソッドのAlias
モデルオブジェクトを生成する。
保存はまだされていないため、saveメソッドなどを使って保存する。
生成と同時に保存したい場合は、createメソッドを使用する。

使い方

モデル.build([属性])

引数なし
person.pets.build
# => #<Pet id: nil, name: nil, person_id: 1>
属性
person.pets.build(name: 'Fancy-Fancy')
# => #<Pet id: nil, name: "Fancy-Fancy", person_id: 1>
ブロック
person.pets.build([{name: 'Spook'}, {name: 'Choo-Choo'}, {name: 'Brain'}])
# => [
#      #<Pet id: nil, name: "Spook", person_id: 1>,
#      #<Pet id: nil, name: "Choo-Choo", person_id: 1>,
#      #<Pet id: nil, name: "Brain", person_id: 1>
#    ]
ソースコード
ソースコード検索

データベースから検索(find)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

データベースからデータを検索する

注意

rails3からrails4で大きく変更があったメソッドの一つ。
find(:all)やfind(:all, :conditions ...)などの書き方が廃止になりました。whereなどを使うようにしてください。
activerecord-deprecated_findersというgemを使うことで使えるようになりますが、推奨されていないようです。

使い方

rails4
1つのレコードを取得
モデル.find(引数)
配列を使ってレコードを取得
モデル.find(配列)
rails3
1つのレコードを取得
モデル.find(:id [, オプション])
配列を使ってレコードを取得
モデル.find(配列 [, オプション])
テーブルの先頭行を取得
モデル.find(:first, [オプション])
テーブルの最終行を取得
モデル.find(:last,[オプション])
テーブルの全データを取得
モデル.find(:all, [オプション])

オプション

オプション説明バージョン
:condition検索条件を指定rails3まで
:offsetオフセット値rails3まで
:limit取得件数rails3まで
:orderソートrails3まで
:select取得したデータのカラムrails3まで
:groupグルーピング命令rails3まで
:joinsテーブル結合rails3まで
:include関連テーブルのデータを取得rails3まで
:readonlytrueが設定されていると、保存できないrails3まで
:fromselectに挿入されるテーブル名をオーバーライトできるrails3まで
:lockデータベースにロックrails3まで

保存できない場合

メソッド名保存できない場合
find(:id)例外
find(配列)例外
find(:first)nil
find(:last)nil
find(:all)空の配列

rails4
IDで検索
Page.find(1)
# SELECT "pages".* FROM "pages" WHERE "pages"."id" = 1 LIMIT 1
複数の項目をIDで検索
Page.find([1, 2])
# SELECT "pages".* FROM "pages" WHERE "pages"."id" IN (1, 2)
rails3
IDで検索
Page.find(1)
# SELECT "pages".* FROM "pages" WHERE "pages"."id" = 1 LIMIT 1
複数の項目をIDで検索
Page.find([1, 2])
# SELECT "pages".* FROM "pages" WHERE "pages"."id" IN (1, 2)
すべての項目を取得
Page.find(:all)
# SELECT "pages".* FROM "page"
はじめにヒットした項目を取得
Page.find(:first)
# SELECT "pages".* FROM "pages" LIMIT 1
最後にヒットした項目を取得
Page.find(:last)
# SELECT "pages".* FROM "pages" ORDER BY pages.id DESC LIMIT 1
特定のカラムのみロード
Page.find(:first, :select => "name, content")
# SELECT name, content FROM "pages" LIMIT 1
category_idが1のすべてのレコードを取得
Page.find(:all, :conditions => { :category_id => 1 })
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1
category_idが1でurl_idが1のすべてのレコードを取得
Page.find(:all, :conditions => ["category_id = ? and url_id = ?", 1, 1])
# SELECT "pages".* FROM "pages" WHERE (category_id = 1 and url_id = 1)
titleがnilでないすべてのレコードを取得
Page.find(:all, :conditions => ["category_id NOT ?", nil])
# SELECT "pages".* FROM "pages" WHERE (title NOT NULL)
category_idが1のはじめのレコードを取得
Page.find(:first, :conditions => {:category_id => 1})
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1 LIMIT 1
検索結果の並び順を変更
Page.find(:all, :order => "created_at DESC")
# SELECT "pages".* FROM "pages" ORDER BY created_at DESC
検索結果の取得件数を指定
Page.find(:all, :limit => 3)
# SELECT "pages".* FROM "pages" LIMIT 3
読み飛ばし件数を指定
Page.find(:all, :offset => 20, :limit => 10)
# SELECT "pages".* FROM "pages" LIMIT 10 OFFSET 20
SQLのJOIN句の文字列を指定
Page.find(:first, :joins => :category)
# SELECT "pages".* FROM "pages" INNER JOIN "categories" ON "categories"."id" = "pages"."category_id" LIMIT 1
SQLのGROUP BY句の文字列を指定
Page.find(:all, :group => "category_id")
# SELECT "pages".* FROM "pages" GROUP BY category_id
テーブルを結合して、情報をロード
Page.find(:all, :include => "category")
# SELECT "pages".* FROM "pages"
# SELECT "categories".* FROM "categories" WHERE ("categories"."id" IN (1,2,3)

その他

SQLインジェクション対策

外部から渡される値は、エスケープしてデータベースに渡す

使い方
["カラム名 = ?", 検索する値]
外部から入力された値を使う場合
params[:user]user = User.find(:all, :conditions => ["name = ?", name])
検索条件としてハッシュのキーとバリューを使う場合
User.find(:all, :conditions => params[:user]]
ワイルドカードでデータベースを検索
使い方
like
User.find(:all, :conditions => ["name like ?", params[:name]+"%"])

ソースコード

ソースコード検索

カラム名を指定して最初の1件を取得(find_by_colum)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラム名を指定して、最初の1件を取得

使い方

モデル.find_by_カラム名(検索する値)

category_idが1の最初の値を取得
Page.find_by_category_id(1)
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1 LIMIT 1

SQLを直接指定(find_by_sql)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

SQL文を直接書いて、レコードを取得する

使い方

モデル.find_by_sql(SQL文)

SQLを直接使って検索
Page.find_by_sql("SELECT * FROM pages LIMIT 10")
# SELECT * FROM pages LIMIT 10

ソースコード

ソースコード検索

検索条件を指定して取得(where)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

データベースから条件を指定し、条件に当てはまるレコードをすべて取得する

使い方

モデル.where(条件)

文字列で指定
Page.where("category_id = '1'")
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1
ハッシュで指定
Page.where(category_id: 1)
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1
配列で指定
Page.where(["category_id = ? and url_id = ?", 1, 1])
# SELECT "pages".* FROM "pages" WHERE (category_id = 1 and url_id = 1)
nilのすべてのデータを取得
Page.where("title = ?", nil)
# SELECT "pages".* FROM "pages" WHERE (title = NULL)
nilでないすべてのデータを取得
Page.where("title not ?", nil)
# SELECT "pages".* FROM "pages" WHERE (title not NULL)

ソースコード

ソースコード検索

取得した値を並び替え(order/reorder)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

取得した値を特定のキーで並び替える

使い方

通常
モデル.order(ソート式)
上書き
モデル.reorder(ソート式)

pagesテーブルをcategory_idで並び替える
Page.order("category_id")
# SELECT "pages".* FROM "pages" ORDER BY category_id
Page.order(:category_id)
# SELECT "pages".* FROM "pages" ORDER BY category_id
Page.order("category_id ASC")
# SELECT "pages".* FROM "pages" ORDER BY category_id ASC
逆順で並び替える
Page.order("category_id DESC")
# SELECT "pages".* FROM "pages" ORDER BY category_id DESC
2つのカラムを指定して並び替える
User.order('name DESC, email')
# SELECT "users".* FROM "users" ORDER BY name DESC, email

ソースコード

ソースコード検索

取得するカラムを指定(select)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

取得するカラムを指定する

使い方

モデル.select(取得するカラム)
モデル.select(ブロック)

usersテーブルのnameカラムのみ取得
User.select("name, sex")
# SELECT name, sex FROM users

ソースコード

ソースコード検索

特定のレコード件数を取得(limit)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

特定のレコード件数を取得

使い方

モデル.limit(最大取得行数)

usersテーブルから最大5件を取得
User.limit(5)
# SELECT * FROM users LIMIT 5

ソースコード

ソースコード検索

取得した値をグループ化(group)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

取得した値をグループ化する

使い方

モデル.group(グループ化キー)

usersテーブルをnameでグルーピング
User.group("name")
# SELECT * FROM users GROUP BY name
User.group('name, age')
# SELECT * FROM users GROUP BY name, age

ソースコード

ソースコード検索

取得したデータを絞り込む(having)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

データベースから取得した値を元に絞り込む

使い方

モデル.having(条件式)

平均ageが30以上を取得
User.having(['AVG(age) >= ?', 30])
# SELECT * FROM users HAVING AVG(age) >= 30

ソースコード

ソースコード検索

よく利用する検索条件をあらかじめ準備(scope)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

よく利用する検索条件をあらかじめ準備

使い方

scope(スコープ名, 条件式)

rails_baseカテゴリのデータだけを取得するスコープ
scope :rails_base, where(:category => "rails_base")
Page.rails_base

ソースコード

ソースコード検索

デフォルトのスコープを定義(default_scope)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

デフォルトのスコープを定義

使い方

default_scope(条件式 [, オプション])

オプション

オプション説明
:condition検索条件を指定
:offsetオフセット値
:limit取得件数
:orderソート
:select取得したデータのカラム
:groupグルーピング命令
:joinsテーブル結合
:include関連テーブルのデータを取得
:readonlytrueが設定されていると、保存できない
:fromselectに挿入されるテーブル名をオーバーライトできる
:lock データベースにロック

class Article < ActiveRecord::Base
  default_scope { where(published: true) }
end

Article.all # => SELECT * FROM articles WHERE published = true

ソースコード

ソースコード検索

検索結果の行数を取得(count)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

検索件数を取得

使い方

モデル.count(カラム名 [, オプション})

テーブルの行数を計算
User.count
# SELECT count(*) AS count_all FROM users

ソースコード

ソースコード検索

カラムの最大値を求める(maximum)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラムの最大値を求める

使い方

モデル.maximum(カラム名 [, オプション])

オプション

オプション説明
:conditions関数を条件に一致する行に制限
:include関連テーブルのデータを取得
:joinsテーブル結合
:order結果を並び替える
:select集計に使う行を選択
:distinctカラム内の重複した値を除いて、別個の値のみカウント
:groupグルーピング命令

usersテーブルのageカラムの最大値を求める
User.maximum('age')
# SELECT MAX("users"."age") AS max_id FROM "users"

ソースコード

ソースコード検索

カラムの平均値を求める(average)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラムの平均値を求める

使い方

モデル.average(カラム名 [, オプション])

オプション

オプション説明
:conditions関数を条件に一致する行に制限
:include関連テーブルのデータを取得
:joinsテーブル結合
:order結果を並び替える
:select集計に使う行を選択
:distinctカラム内の重複した値を除いて、別個の値のみカウント
:groupグルーピング命令

平均を求める
Page.average(:count)
# SELECT AVG("pages"."count") AS avg_id FROM "pages"
カテゴリが1のcountの平均を求める
Page.average(:count, :conditions => ["category_id = 1"])
# SELECT AVG("pages"."count") AS avg_id FROM "pages" WHERE (category_id = 1)
カテゴリ名がrailsのcountの平均を求める
Page.average(:count, :joins => :category, :conditions => ["name = 'rails'"])
# SELECT AVG("pages"."count") AS avg_id FROM "pages" INNER JOIN "categories" ON "categories"."id" = "pages"."category_id" WHERE (name = 'rails')
カテゴリごとにグルーピングして、平均を求める
Page.average(:count, :group => :category_id)
# SELECT AVG("pages"."count") AS average_position, category_id AS category_id FROM "pages" GROUP BY category_id

ソースコード

ソースコード検索

カラムの最小値を求める(minimum)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラムの最小値を求める

使い方

モデル.minimum(カラム名 [, オプション])

オプション

オプション説明
:conditions関数を条件に一致する行に制限
:include関連テーブルのデータを取得
:joinsテーブル結合
:order結果を並び替える
:select集計に使う行を選択
:distinctカラム内の重複した値を除いて、別個の値のみカウント
:groupグルーピング命令

usersテーブルのageカラムの最小値を求める
User.minimum('age')
# SELECT MIN("users"."age") AS min_id FROM "users"

ソースコード

ソースコード検索

カラムの合計値を求める(sum)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラムの合計値を求める

使い方

モデル.sum(カラム名[, オプション])

オプション

オプション説明
:conditions関数を条件に一致する行に制限
:include関連テーブルのデータを取得
:joinsテーブル結合
:order結果を並び替える
:select集計に使う行を選択
:distinctカラム内の重複した値を除いて、別個の値のみカウント
:groupグルーピング命令

Ratingsテーブルのscoreカラムの合計を求める
Rating.sum(:score)
#  SELECT SUM("Ratings"."score") AS sum_id FROM "Ratings"

ソースコード

ソースコード検索

データベースに保存(save)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

生成したモデルオブジェクトをデータベースに保存する

保存メソッドの種類

メソッドバリデーションによる検証の有無保存できない場合
savefalseを返す
save!例外を発生

save

基本的な使い方
user = User.new
user.name = "A"
user.save
新しいローカル変数を作らずに保存
User.new do |i|
  i.name = "A"
  i.save
end
属性ハッシュの保存
user = User.new(:name => "A")
user.save
データベースへの保存の有無で処理を分ける
if @user.save
  redirect_to :list
else
  render :action => "new"
end
複数の項目を保存
begin
  Entry.transaction do
    @many_entries.each { |entry| entry.save! }
  end
 vredirect_to :list
  rescue ActionRecord::RecordInvalid, ActionRecord::RecordNotSaved => ex
  render :action => "input_multi_entries"
end
属性を変更して保存
@entry = Entry.find(params[:id])
@entry.message = "new Message"
@entry.save
複数の項目を1度に更新
@user = User.find(parms[:id])
@user.attributes = { :username => 'Phusion', :is_admin => true }
@user.save
ソースコード検索

save!

基本的な使い方
user = User.new
user.name = "A"
user.save
ソースコード検索

データベースを更新(update/update_all/update_attributes/update_attribute)

説明

データベースから取得したオブジェクトを更新

update

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

レコードの更新

使い方
モデル.update(カラム名 = 値)
データを更新
User.update("name = 'A'")
ソースコード
ソースコード検索

update_all

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

条件に一致するレコードをすべて更新

使い方
モデル.update_all(カラム名 = 値 「、オプション])
オプション
オプション説明
:limit取得する件数
:order並び順
複数のデータを更新
User.update_all("name='A'","category='B')
ソースコード
ソースコード検索

update_attributes

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

属性ハッシュを指定して更新

使い方
モデル.update_attributes = { カラム名 = 値 }
複数の項目を一度に変更・保存するメソッド
@user.update_attributes = { :username = 'A', :category = 'B' }
ソースコード検索

update_attribute

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

属性ハッシュを指定して更新

使い方
モデル.update_attribute = { カラム名 = 値 }
属性の変更・保存メソッド
@user.update_attribute = { :username = 'A' }

更新メソッドの種類

メソッドバリデーションによる検証の有無
update
update_all×
update_attributes
update_attribute×

データベースから削除(destroy/delete/destroy_all/delete_all)

destroy

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
使い方
モデル.destroy([引数 or 配列])
ロードしたオブジェクトを削除
entry = Entry.find(:first)<br />entry.destroy
モデルオブジェクトのロードと削除を一度に行う
Entry.destroy([1, 2])
ソースコード
ソースコード検索

delete

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
使い方
モデル.delete([引数 or 配列])
ソースコード
ソースコード検索

destroy_all

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

特定の条件に一致するレコードをまとめて削除

使い方
モデル.destroy_all([検索条件])
条件を指定して削除
Person.destroy_all("last_login < '2004-04-04'")
Person.destroy_all(status: "inactive")
Person.where(age: 0..18).destroy_all
ソースコード
ソースコード検索

delete_all

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
使い方
モデル.delete_all([検索条件])
Post.delete_all("person_id = 5 AND (category = 'Something' OR category = 'Else')")
Post.delete_all(["person_id = ? AND (category = ? OR category = ?)", 5, 'Something', 'Else'])
Post.where(person_id: 5).where(category: ['Something', 'Else']).delete_all
ソースコード
ソースコード検索

カラムを処理(calculate)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラムを処理

使い方

モデル.calculate(条件, カラム名 [, オプション])

オプション

オプション説明
:conditions関数を条件に一致する行に制限
:include別のテーブルとのインクルードを指定
:joins別のテーブルとの結合を指定
:order結果を並び替える
:groupグルーピング命令
:select集計に使う行を選択
:distinctカラム内の重複した値を除いて、別個の値のみカウント

pagesテーブルのカラム数
Page.calculate(:count, :all)
# SELECT COUNT(*) FROM "pages"

ソースコード

ソースコード検索

1対1のリレーションシップ

説明

テーブルのカラムの1つが別のテーブルのカラムの1つを参照する関係
学校を例にすると、生徒とプロフィールの関係

特徴

  • 所有しているテーブル側のモデルにhas_one
  • 所属している側のモデルにbelongs_to

命名規則

  • 外部キーのカラム名は、参照先のモデル名を単数形にしたものに+「_id」
  • belongs_to, has_oneに指定する名前は、モデル名の単数形

使い方

class モデルA < ActiveRecode::Base
  belongs_to :モデルB
  accepts_nested_attributes_for :モデルB
end
class モデルB < ActiveRecode::Base
  has_one :モデルA
  accepts_nested_attributes_for :モデルA
end

参照元のモデルでbelongs_toを宣言
class Blog < ActiveRecord::Base
  belongs_to :user
  accepts_nested_attributes_for :user
end
参照先のモデルでhas_oneを宣言
class User < ActiveRecord::Base
  vhas_one :blog
  accepts_nested_attributes_for :blog
end

1対多のリレーションシップ

説明

テーブルの複数のカラムが別のテーブルのカラムの1つを参照する関係
学校を例にすると、学校と生徒の関係

特徴

  • 所有しているテーブル側のモデルにhas_many
  • 所属している側のモデルにbelongs_to

命名規則

  • 外部キーのカラム名は、参照先のモデル名を単数形にしたものに+「_id」
  • belongs_toに指定する名前は、モデル名の単数形
  • has_manyに指定する名前は、モデル名の複数形

使い方

class モデルA < ActiveRecord::Base
  belongs_to モデルB
end
class モデルB < ActiveRecord::Base
  has_many モデルA
end

参照元のモデルでbelongs_toを宣言
class Post < ActiveRecord::Base
 vbelongs_to :author
end
参照先のモデルでhas_manyを宣言
class Author < ActiveRecord::Base
  has_many :posts
end

多対多のリレーションシップ

説明

モデルがお互いに参照したりされたりする関係学校を例にすると、生徒と教科の関係

命名規則

  • 外部キーのカラム名は、参照先のモデル名を単数形にしたものに+「_id」
  • belongs_to, has_oneに指定する名前は、モデル名の単数形
  • has_many, has_and_belongs_to_manyに指定する名前は、モデル名の複数形
  • 結合テーブルは、アルファベット順に参照先モデル名の複数形を「_」でつなげる

関連テーブルでbelongs_toを宣言
class Order < ActiveRecord::Base
  belongs_to :customer
  belongs_to :product
end
参照テーブルでhas_manyを宣言
class Project < ActiveRecord::Base
  has_many :orders
  has_many :customers, :through => :orders
end
class Customer < ActiveRecord::Base
  has_many :orders
  has_many :products, :through => :orders
end

保存

両方とも保存済み
  • 生成時に保存
どちらか一方でも未保存
  • saveで保存

参照元テーブルから参照先テーブルにアクセス(belongs_to)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

参照元テーブルから参照先テーブルにアクセスする

使い方

rails3
belongs_to(関連モデル名 [, オプション])
rails4
belongs_to(関連モデル名 [, scope, オプション])

オプション

オプション説明デフォルト
:class_name関連を設定するモデルクラス名を指定。関連名と参照先のクラス名を異なるものにしたい場合に指定
:foreign_key参照先を参照するための外部キーの名前を指定:foreign_key
:foreign_type参照先を参照するための外部キーの型を指定:foreign_type
:primary_key主キーを指定id
:dependent値を:destroyにすると、参照先が削除される場合に参照元もDBから削除
:counter_cachetrueにすると、カウンタキャッシュを使用
:polymorphicポリモーフィック関連を定義
:validate関連オブジェクトの検証の有無false
:autosavetrueにすると、親のオブジェクトが保存されると、ロードされたオブジェクトも保存
:touchtrueにすると、updated_atまたはupdated_onがオブジェクトが保存または破棄された場合に現在の時刻を設定
:inverse_of関連を指定
:required

追加されているメソッド

メソッド説明
association(force_reload = false)自分自身を参照しているオブジェクトを返す
オブジェクトが無い場合は、nilを返す
association=(associate)引数を参照元オブジェクトとして設定
それ以外の参照元との関連は破棄
build_association(attributes = {})新しいオブジェクトを生成
引数にはオブジェクトを生成するのに必要なパラメータを指定
この時点では保存されない
create_association(attributes = {})新しいオブジェクトを生成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
create_association!(attributes = {})新しいオブジェクトを生成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
失敗時に例外を発生

保存

参照元オブジェクトが未保存の場合
  • saveのタイミングで外部キーが設定され保存
  • 参照先オブジェクトが未保存であれば、saveのタイミングで自動的に保存
参照元オブジェクトが保存済みの場合
  • 保存済みの場合には、生成したタイミングで自動的にDBに保存

UserとProjectの関係
Projectモデル
class Project < ActiveRecord::Base
  belongs_to :user
end
クラス名としてUserを指定
belongs_to :admin_user, :class_name => "User"
user_id = 2を抽出
belongs_to :user, :conditions => "user_id = 2"
逆順で並び替える
belongs_to :user, :order => "id DESC"
データを削除するときに関連するテーブルを削除
belongs_to :user, :dependent => :destroy
外部キーを指定
belongs_to :user, foreign_key => "blog_id"

ソースコード

ソースコード検索

1対1の関連を宣言(has_one)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

指定のクラスがこのクラスの子であることを宣言

使い方

rails3
has_one(関連モデル名, [オプション])
rails4
has_one(関連モデル名 [, scope ,オプション])

オプション

オプション説明バージョン
:class_name関連名と参照元のクラス名を異なるものにしたい場合に指定
:dependent値を:destroyにすると、参照先が削除される場合に参照元もDBから削除
:foreign_key
:primary_key参照先のテーブルに定義されている外部キーの名前を指定
:asポリモーフィック関連を定義
:through結合モデルの指定
:sourcehas_one :throughの元となるオブジェクトを指定
:source_typepolymorphicの指定
:validateオブジェクトが保存されると、バリデイトが実行される
:autosave親のオブジェクトが保存されると、ロードされたオブジェクトも保存
:inverse_of
:conditions参照元を検索する際の条件を設定。SQLのWHERE句にしている案件を文字列で定義rails3まで
:include関連モデルクラスのオブジェクトをロードする際、同時に読み込みたいモデルを指定rails3まで
:order関連をロードする際のソート順を設定rails3まで
:readonly読み込み専用のオブジェクトを生成したい場合はtrueを指定rails3まで
:selectカラムの指定rails3まで

追加されるメソッド

メソッド説明
association(force_reload = false)自分自身を参照しているオブジェクトを返す
オブジェクトが無い場合は、nilを返す
association=(associate)引数を参照元オブジェクトとして設定
それ以外の参照元との関連は破棄
build_association(attributes = {})新しいオブジェクトを作成
引数にはオブジェクトを生成するのに必要なパラメータを指定
この時点では保存されない
create_association(attributes = {})新しいオブジェクトを作成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
create_association!(attributes = {})新しいオブジェクトを作成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
エラー時に例外を発生

保存

参照先オブジェクトが未保存の場合
  • saveのタイミングで外部キーが設定され保存
  • 参照先オブジェクトが未保存であれば、saveのタイミングで自動的に保存
参照先オブジェクトが保存済みの場合
  • 保存済みの場合には、作成するタイミングで自動的にDBに保存

UserとProjectの関係
マイグレーションファイル
class CreateUsersProjectsTable < ActiveRecord::Migration
  def self.up
    create_table :users_projects, :id => false do |t|
      t.integer :user_id
      t.integer :project_id
    end
  end
  def self.down
    drop_table :users_projects
 vend
end
Userモデル
class User < ActiveRecord::Base
  has_one :project
end
Projectモデル
class Project < ActiveRecord::Base
  belongs_to :user
end
クラス名としてUserを指定
has_one :admin_user, :class_name => "User"
user_id = 2を抽出
has_one :user, :conditions => "user_id = 2"
逆順で並び替える
has_one :user, :order => "id DESC"
データを削除するときに関連するテーブルを削除
has_one :user, :dependent => :destroy
外部キーを指定
has_one :user, foreign_key => "blog_id"

ソースコード

ソースコードを見る
# File activerecord/lib/active_record/associations.rb, line 1307
def has_one(name, scope = nil, options = {})
  reflection = Builder::HasOne.build(self, name, scope, options)
  Reflection.add_reflection self, name, reflection
end

ソースコード検索

1対多の関連を宣言(has_many)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

1対多や多対多の関係を表現するときに使用

使い方

rails3
has_many(関連モデル名 [, オプション])
 accepts_nested_attributes_for 関連モデル名
rails4
has_many(関連モデル名 [, scope, オプション])
 accepts_nested_attributes_for 関連モデル名

オプション

オプション説明バージョン
:class_name関連名と参照元のクラス名を異なるものにしたい場合に指定
:foreign_key参照元のテーブルに定義されている外部キーの名前を指定
:primary_key参照先のテーブルに定義されている外部キーの名前を指定
:dependent値を:destroyにすると、参照先が削除される場合に参照元もDBから削除
:counter_cacheカウンターキャッシュrails4以降
:asポリモーフィック関連を定義
:through結合モデルの指定
:sourcehas_one :through の元となるオブジェクトを指定
:source_typepolymorphicの指定
:validateオブジェクトが保存されると、バリデイトが実行される
:autosave親のオブジェクトが保存されると、ロードされたオブジェクトも保存
:inverse_ofSpecifies the name of the belongs_to association on the associated object that is the inverse of this has_many association. Does not work in combination with :through or :as options. See ActiveRecord::Associations::ClassMethods's overview on Bi-directional associations for more detail.
:conditions参照元を検索する際の条件を設定すSQLのWHERE句にしている案件を文字列で定義rails3まで
:counter_sql関連の大きさを指定するためのSQL文を指定rails3まで
:extendプロキシを拡張するためのモジュールrails3まで
:finder_sql関連を取得SQL文を指定rails3まで
:groupグルーピング命令rails3まで
:include関連モデルクラスのオブジェクトをロードする際、同時に読み込みたいモデルを指定rails3まで
:limit取得件数rails3まで
:offsetオフセット値rails3まで
:order関連をロードする際のソート順を指定。SQLのORDER BY句に指定する条件を文字列で定義rails3まで
:readonly読み込み専用のオブジェクトを生成したい場合はtrueを指定rails3まで
:selectカラムの指定rails3まで
:uniq重複した関連を無視するかrails3まで

追加されるメソッド

メソッド説明バージョン
collection(force_reload = false)関連付けられている配列を返す
collection<<(object, …)collectionにobjectを追加
collection.delete(object, …)1つ以上のobjectを削除
collection.destroy(object, …)1つ以上のobjectを削除rails4以降
collection=objects 多対多でひも付いたモデルを更新
collection_singular_ids関連付けられているオブジェクトのIDの配列を返す
collection_singular_ids=ids主キーを切り替える
collection.clearすべて切断
collection.empty?オブジェクトが関連付けられていなければtrueを返す
collection.sizeサイズを返す
collection.find(…)通常のfindメソッド
collection.exists?(…)与えられた条件に一致するモデルが存在するか確認
collection.build(attributes = {}, …)新しいモデルを作り、多対多で関連付けるがDBは更新しない
collection.create(attributes = {})新しいモデルを作り、多対多で関連付けてDBを更新

保存

参照先オブジェクト、参照元オブジェクトのどちらかが未保存の場合
  • saveのタイミングで両方とも保存
参照先オブジェクト、参照元オブジェクトの保存済みの場合
  • 参照元オブジェクトの外部キーが更新され、保存

UserとProjectの関係
マイグレーションファイル
class CreateUsersProjectsTable < ActiveRecord::Migration
  def self.up
    create_table :users_projects, :id => false do |t|
      t.integer :user_id
      t.integer :project_id
    end
  end
  def self.down
    drop_table :users_projects
  end
end
Userモデル
class User < ActiveRecord::Base
  has_many :projects
  accepts_nested_attributes_for :projects
end
Projectモデル
class Project < ActiveRecord::Base
  belongs_to :user
  accepts_nested_attributes_for :user
end
クラス名としてUserを指定
has_many :admin_user, :class_name => "User"
accepts_nested_attributes_for :admin_user
user_id = 2を抽出
has_many :user, :conditions => "user_id = 2"
accepts_nested_attributes_for :user
逆順で並び替える
has_many :user, :order => "id DESC"
accepts_nested_attributes_for :user
Group
has_many :users, :group => "category"
accepts_nested_attributes_for :users
外部キーを指定
has_many :user, foreign_key => "blog_id"
accepts_nested_attributes_for :user

ソースコード

ソースコード検索

多対多の関連を宣言(has_and_belongs_to_many)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

多対多の関連を表現するときに使用

使い方

rails3
has_and_belongs_to_many(関連モデル名 [, オプション])
rails4
has_and_belongs_to_many(関連モデル名 [, scope, オプション])

オプション

オプション説明バージョン
:class_name関連モデルのクラス名を指定
関連モデル名から推測できない場合のみ指定
:join_table結合テーブルの名前を指定
:foreign_key多対多の関連で使用する外部キーの名前を指定
:association_foreign_key多対多の関係で関連先への外部キーを指定
:readonly関連先のオブジェクトを読み取り専用にするか
:validate現在のモデルを保存する場合、関連先の検証を実行
:autosave親モデルに合わせて、保存や削除を行うか
:conditions関連モデルを取得する際の条件式を指定rails3まで
:counter_sql関連の大きさを指定するためのSQL文を指定rails3まで
:delete_sql関連を削除するためのSQL文を指定rails3まで
:extendプロキシを拡張するためのモジュールrails3まで
:finder_sql関連を取得SQL文を指定rails3まで
:group結果をグループ化rails3まで
:include2次の関連も取得するかrails3まで
:insert_sql関連を追加するためのSQL文を指定rails3まで
:limit取得する関連モデルの上限を指定rails3まで
:offset取得する関連モデルの開始位置を指定rails3まで
:order関連先オブジェクトの取得順序を指定rails3まで
:select関連先オブジェクトの取得例を指定rails3まで
:uniq重複した関連を無視するかrails3まで

使えるようになるメソッド

メソッド説明
collection(force_reload = false)多対多でひも付いた先のモデルである一覧を取得
collection<<(object, …)1つ以上のモデルを多対多の関連に追加
collection.delete(object, …)1つ以上のモデルを多対多の関連から外す
collection.destroy(object, …)1つ以上のモデルを多対多の関連から外す
collection=objects多対多でひも付いたモデルを更新
collection_singular_ids多対多でひも付いたモデルのidの配列を取得
collection_singular_ids=ids多対多でひも付いたモデルのidが指定された物に更新
collection.clear多対多の関連をすべて削除
collection.empty?多対多の関連にあるモデルが1つもないときにtrue
collection.size多対多でひも付いたモデル数を返す
collection.find(id)多対多の関連モデルでfindを実行
collection.exists?(…)与えられた条件に一致するモデルが存在するか確認
collection.build(attributes = {})新しいモデルを作り、多対多で関連付けるがDBは更新しない
collection.create(attributes = {})新しいモデルを作り、多対多で関連付けてDBを更新

UserとProjectの関係
マイグレーションファイル
class CreateUsersProjectsTable < ActiveRecord::Migration
  def self.up
    create_table :users_projects, :id => false do |t|
      t.integer :user_id
      t.integer :project_id
    end
  end
  def self.down
    drop_table :users_projects
  end
end
Userモデル
class User < ActiveRecord::Base
  has_and_belongs_to_many :projects
end
Projectモデル
class Project < ActiveRecord::Base
  has_and_belongs_to_many :users
end

ソースコード

ソースコード検索

トランザクション(transaction)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

分割不可能な複数のレコードの更新を1つの単位にまとめて処理すること

特徴

  • データベース内の情報の整合性を保つための手段
  • 複数のデータベースにまたがる分散トランザクションはサポートしていない
  • 使用するにはデータベースがトランザクションをサポートしていることが必要

使い方

ActiveRecord::Base.transaction do
  例外が発生するかもしれない処理
end
  例外が発生しなかった場合の処理
resque => e
  例外が発生した場合の処理
モデル.transaction do
  例外が発生するかもしれない処理
end
  例外が発生しなかった場合の処理
resque => e
  例外が発生した場合の処理
  • ブロック内のすべての処理が正常に行われた場合に保存
  • エラーが発生した場合は、ロードバック

def new
  User.transaction do
    a1 = User.new(:name => 'tarou')
    a1.save!
    a2 = User.new):name ~> 'jirou')
    a2.save!
  end
  render :text => '更新に成功しました'
  rescue => e
  render :text => e.message
end

ソースコード

ソースコード検索

ポリモーフィック関連

ポリモーフィックとは

  • belongs_to宣言に:polymorphicオプションを指定すると、ポリモーフィック関連になる
  • 参照先となるモデルクラスをあらかじめ定義せず、参照元となるオブジェクトごとに指定する関連

使い方

  • 参照元となるモデルクラスに対応するテーブルに、参照先のIDと参照先クラスを指定するカラムをそれぞれ生成
  • 参照先のIDを保存するカラムは「belongs_to宣言で渡す関連名_id」
  • 参照先クラスを指定するカラムは「関連名type」
ポリモーフィック関連を利用するマイグレーションファイルの生成
$ rails generate model AttachmentImage attachable_id:integer attachable_type:string
class CreateAttachmentImage < ActiveRecord::Migration
  def self.up
    create_table :attachment_images do |t|
      t.integer :attachable_id
      t.string :attachable_type
 
    t.timestamps
  end
end
ボリモーフイツク関連を利用する宣言
class AttachmentImage < ActiveRecord::Base
  belongs_to :attachable, :polymorphic => true
end
class Blog < ActiveRecord::Base
  has_many :entries
  has_one :attachment_image, :as => :attachable
end
class Entry < ActiveRecord::Base
  belongs_to :blog
end
def self.down
  drop_table :attachment_images
end

データベースのロック

楽観的ロック

あらかじめカラムのロックバージョンを記録しておき、更新時にロックバージョンが変わっていないことを検証して保存

class CreateAddLockColumnToEntries < ActiveRecord::Migration
  def self.up
    create_table :add_lock_column_to_entries do |t|
      t.integer :entries, :lock_version, :null => false, :default => 0
    end
  end

  def self.down
    drop_table :add_lock_column_to_entries
  end
end

悲観的ロック

データベース側でレコードをロックし、並行に更新できないようにする

locked_entry = Entry.find(1,:lock => true)
  • MySQLとPostgreSQLでのみ利用可能

特定のレコード位置から取得(offset)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

特定のレコード位置から取得する

使い方

モデル.offset(取得開始位置)

usersテーブルの5件目以降を取得
Page.offset(5)
# SELECT "pages".* FROM "pages" LIMIT -1 OFFSET 5

ソースコード

ソースコード検索

カウンターキャッシュ(counter_cache)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

子モデルの数を親モデルのカラムに保存

概要

  • デフォルトを0
  • カラム名は、子モデルのテーブル名_countがおすすめ

使い方

belongs_to :親モデル, :counter_cache => :親モデルのカラム

Commentの登録や削除で、comments_countが自動更新
def self.up
  add_column :entries, :comments_count, :integer, : default => 0
end
belongs_to :entry, :counter_cache => :comments_count

ソースコード検索

親モデルを削除するとき子モデルを自動削除

説明

親モデルを削除するときに子モデルを自動的に削除

使い方

has_many :モデル名, :dependent => :destroy

has_many :members, :dependent => :destroy

データの存在を確認(exists?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

指定したデータが存在するか

使い方

モデル.exists?(条件)

Pagesテーブルに1件でもデータは存在するか確認
Page.exists?
# SELECT 1 FROM "pages" LIMIT 1
categoryがrailsであるデータが存在するか確認
Page.exists?(:category => "rails")
# SELECT 1 FROM "pages" WHERE "pages"."category" = "rails" LIMIT 1

ソースコード

ソースコード検索

タイムスタンプの自動保存を停止(record_timestamps)

説明

タイムスタンプの自動保存を停止

使い方

ActiveRecord::Base.record_timestamps = false

属性変更を確認・取得(changed/changed?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

属性が変更されたかどうか、また変更点を取得

使い方

属性変更を取得
モデル.changed
属性変更を確認
モデル.changed?

person.changed # => []
person.name = 'bob'
person.changed # => ["name"]
person.changed? # => false
person.name = 'bob'
person.changed? # => true

ソースコード検索

ソースコード

複数のテーブルを結合(joins)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

複数のテーブルを結合して検索

使い方

モデル.joins(条件)

categoryテーブルにpostテーブルを結合して検索
Category.joins(:posts)
# SELECT categories.* FROM categories INNER JOIN posts ON posts.category_id = categories.id
2個のテーブルをjoin
Post.joins(:category, :comments)
# SELECT posts.* FROM posts
# INNER JOIN categories ON posts.category_id = categories.id
# INNER JOIN comments ON comments.post_id = posts.id
ネストして結合
Page.joins(:categories => :element)
#  SELECT "pages".* FROM "pages" INNER JOIN "pages_categories" ON "pages_categories"."page_id" = "pages"."id" INNER JOIN "categories" ON "categories"."id" = "pages_categories"."category_id" INNER JOIN "elements" ON "elements"."id" = "categories"."element_id"
SQLで記述
User.joins("LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id")
# SELECT "users".* FROM "users" LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id

ソースコード

ソースコード検索

アクティブレコードについて

アクティブレコードとは

データベースにアクセスするための仕組み

予約フィールド

フィールド名説明
id主キー
created_atレコードの新規作成日時
updated_atレコードの更新日時

XML変換(to_xml)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルオブジェクトをXML形式に変換する。

使い方

モデル.to_xml

User.limit(2).to_xml
# <?xml version="1.0" encoding="UTF-8"?>
# <contributors type="array">
#   <contributor>
#     <id type="integer">1</id>
#     <name>Railsの基礎知識</name>
#   </contributor>
#   <contributor>
#     <id type="integer">2</id>
#     <name>Rubyの基礎知識</name>
#   </contributor>
# </contributors>

ソースコード

特定のレコードをインクリメント(increment)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

特定のレコードをインクリメント

使い方

モデル.increment(レコード, インクリメントする値)

Pageテーブルのnumレコードを3ずつインクリメント
Page.increment(:num, 3)

ソースコード

ソースコード検索

すべてのレコードを取得(all)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

テーブルからすべてのレコードを取得する

使い方

モデル.all

Pagesテーブルからすべてのレコードを取得
Page.all
# SELECT "pages".* FROM "pages"

ソースコード

ソースコード検索

カラム名を指定してすべてのレコードを取得(find_all_by)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

カラム名を指定して、検索条件にあうすべてのレコードを取得する。
rails4からは、whereで代替することができる。

使い方

モデル.find_all_by_カラム名(検索する値)

Pagesテーブルのcategory_idが1のすべてのレコードを取得
Page.find_all_by_category_id(1)
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1

先頭のレコードを取得(first)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

テーブルの先頭のレコードを取得する

使い方

モデル.first([件数])

pagesテーブルの先頭のレコードを取得
Page.first
# SELECT "pages".* FROM "pages" LIMIT 1
pagesテーブルの先頭の3つのレコードを取得
Page.first(3)
# SELECT "pages".* FROM "pages" LIMIT 3

ソースコード

末尾のレコードを取得(last)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

テーブルの最後のレコードを取得する

使い方

モデル.last([件数])

pagesテーブルの最後のレコードを取得
Page.last
# SELECT "pages".* FROM "pages" ORDER BY "pages"."id" DESC LIMIT 1
pagesテーブルの最後の3つのレコードを取得
Page.last(3)
# SELECT "pages".* FROM "pages" ORDER BY "pages"."id" DESC LIMIT 3

ソースコード

適応した条件式を除外(except)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルに適応した条件式を除外する

使い方

モデル.except(条件式)

orderによる並び替えを除外
Page.order("category DESC").except(:order)

ソースコード

ソースコード検索

モデルを再取得(reload)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

データベースからレコードを再取得する

使い方

モデル.reload

@page = Page.find(1)
# SELECT "pages".* FROM "pages" WHERE "pages"."id" = ? LIMIT 1  [["id", 1]]
@page.reload
# SELECT "pages".* FROM "pages" WHERE "pages"."id" = ? LIMIT 1  [["id", 1]]

ソースコード

ソースコード検索

レコードのフィールド値(column_for_attribute)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

データベースから取得したレコードのカラム名を取得する

使い方

モデル.column_for_attribute[:カラム名]

pageのtitleを取得
@page = Page.find(1)
@page.column_for_attribute[:title]

ソースコード

ソースコード検索

テーブルのすべてのカラム名を取得(attribute_names)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

テーブルのすべてのカラム名を取得する

使い方

モデル.attribute_names

pagesテーブルのすべてのカラム名を取得
pages.attribute_names

ソースコード

ソースコード検索

レコードの状態をチェック(new_record?/persisted?/changed?/destroyed?)

説明

レコードの状態をチェックする

new_record?

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

新しいレコードかどうかチェックする

使い方
モデル.new_record?
基本形(オプションなし)
User.new_record?
ソースコード
ソースコード検索

persisted?

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

保存済みかどうかチェックする

使い方
モデル.persisted?
基本形(オプションなし)
User.persisted?
ソースコード
ソースコード検索

changed?

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

保存していないレコードがあるかどうかチェックする

使い方
モデル.changed?
基本形(オプションなし)
@user.changed?
ソースコード
ソースコード検索

destroyed?

適応バージョン
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

削除済みかどうかチェックする

使い方
モデル.destroyed?
基本形(オプションなし)
@user.destroyed?

ソースコード

ソースコード検索

関連するテーブルをまとめて取得(includes)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

関連するテーブルをまとめて取得する

使い方

モデル.includes(条件)

基本的な使い方
Page.includes(:category)
# SELECT "pages".* FROM "pages"
# SELECT "categories".* FROM "categories" WHERE "categories"."id" IN (1)

ソースコード

ソースコード検索

取得した値を逆順に並び替え(reverse_order)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

取得した値を特定のキーで逆順に並び替える

使い方

モデル.reverse_order

pagesテーブルをcategory_idを逆順で並び替える
Page.order("category_id").reverse_order

ソースコード

ソースコード検索

データの大きなモデルに対してeachをする場合(find_each)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

分割してレコードを取得して処理をする。
デフォルトで1000件ずつ処理をする。

使い方

モデル.find_each([オプション]) do |i|
end

オプション

オプション説明
:start処理開始位置
:batch_size同時処理数

category_idが1の値をeachする
Page.where(:category_id => 1).find_each do |page|

end

ソースコード

ソースコード検索

複数カラムをまとめる(composed_of)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

複数カラムを擬似的に1つにまとめる

使い方

モデル.composed_of(条件, オプション)

オプション

オプション説明
:class_nameクラス名
:mappingマッピング
:allow_niltrueならば、nilの検証はスキップ
:constructor条件
:converter

composed_of :temperature, mapping: %w(reading celsius)
composed_of :balance, class_name: "Money", mapping: %w(balance amount),
                      converter: Proc.new { |balance| balance.to_money }
composed_of :address, mapping: [ %w(address_street street), %w(address_city city) ]
composed_of :gps_location
composed_of :gps_location, allow_nil: true
composed_of :ip_address,
            class_name: 'IPAddr',
            mapping: %w(ip to_i),
            constructor: Proc.new { |ip| IPAddr.new(ip, Socket::AF_INET) },
            converter: Proc.new { |ip| ip.is_a?(Integer) ? IPAddr.new(ip, Socket::AF_INET) : IPAddr.new(ip.to_s) }

ソースコード

ソースコード検索

モデルが空であるか(any?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルが空ならtrueを返す

使い方

モデル.any?([ブロック])

基本的な使い方
class Person < ActiveRecord::Base
  has_many :pets
end

person.pets.count # => 0
person.pets.any?  # => false

person.pets << Pet.new(name: 'Snoop')
person.pets.count # => 0
person.pets.any?  # => true
ブロック
person.pets
# => [#<Pet name: "Snoop", group: "dogs">]

person.pets.any? do |pet|
  pet.group == 'cats'
end
# => false

person.pets.any? do |pet|
  pet.group == 'dogs'
end
# => true

ソースコード

ソースコード検索

モデルを生成して保存(create)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1
説明

モデルオブジェクトを生成して保存する。
生成のみを行いたい場合は、newメソッドを使用する。

使い方
モデル.create([属性])
基本的な使い方(Ruby1.8 & 1.9)
user = User.create(:name => "TestUser", :profile => "profile")
基本的な使い方(Ruby1.9)
user = User.create(name: "TestUser", profile: "profile")
属性ハッシュの配列を保存
user = User.create([{:name => "A"},{:name => "B"}])
ソースコード
ソースコード検索

複数のレコードを追加(concat)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

主キーを設定して、複数のレコードを追加

使い方

モデル.concat(モデル)

person.pets.concat(Pet.new(name: 'Fancy-Fancy'))
person.pets.concat(Pet.new(name: 'Spook'), Pet.new(name: 'Choo-Choo')

ソースコード

ソースコード検索

テーブルの属性を取得(attribute_for_inspect)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

テーブルの属性を取得する。50文字以降は省略される。

使い方

モデル.attribute_for_inspect(カラム名)

person.attribute_for_inspect(:name)
# => "\"David Heinemeier Hansson David Heinemeier Hansson D...\""

ソースコード

ソースコード検索

モデルに任意のカラムが存在するかチェック(attribute_present?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルに任意のカラムが存在するかチェックする

使い方

モデル.attribute_present?(カラム名)

person.attribute_present?(:title)
# => true

ソースコード

ソースコード検索

モデルの全てのカラムと属性を取得(attributes)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルの全てのカラムと属性を取得する

使い方

モデル.attributes

pageのtitleを取得
@page = Page.find(1)
@page.attributes

ソースコード

ソースコード検索

モデルに任意のカラムが存在するかチェック(has_attribute?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルに任意のカラムが存在するかチェック

使い方

モデル.attributes?(属性)

person.has_attribute?(:name)
# => true
person.has_attribute?('age')
# => true
person.has_attribute?(:nothing)
# => false

ソースコード

ソースコード検索

モデルに対して呼び出せるかチェック(respond_to?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルに対して呼び出せるかチェックする

使い方

モデル.respond_to?(名前 [, include_private=false])

person.respond_to(:name)
# => true
person.respond_to(:name=)
# => true
person.respond_to(:name?)
# => true
person.respond_to('age')
# => true
person.respond_to('age=')
# => true
person.respond_to('age?')
# => true
person.respond_to(:nothing)
# => false

ソースコード

ソースコード検索

型に変更前のハッシュを取得(attributes_before_type_cast)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

型に変更前のハッシュを取得する

使い方

モデル.attributes_before_type_cast

task = Task.new(title: nil, is_done: true, completed_on: '2012-10-21')
task.attributes
# => {"id"=>nil, "title"=>nil, "is_done"=>true, "completed_on"=>Sun, 21 Oct 2012, "created_at"=>nil, "updated_at"=>nil}
task.attributes_before_type_cast
# => {"id"=>nil, "title"=>nil, "is_done"=>true, "completed_on"=>"2012-10-21", "created_at"=>nil, "updated_at"=>nil}

ソースコード

ソースコード検索

任意のカラムに対して型に変更前のハッシュを取得(read_attribute_before_type_cast)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

型に変更前のハッシュを取得する

使い方

モデル.read_attribute_before_type_cast(カラム名)

task = Task.new(id: '1', completed_on: '2012-10-21')
task.read_attribute('id')                            # => 1
task.read_attribute_before_type_cast('id')           # => '1'
task.read_attribute('completed_on')                  # => Sun, 21 Oct 2012
task.read_attribute_before_type_cast('completed_on') # => "2012-10-21"

ソースコード

ソースコード検索

メソッドが存在するかチェック(attribute_method?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

メソッドが存在するかチェックする

使い方

モデル.attribute_method?(属性)

Person.attribute_method?('name')
# => true
Person.attribute_method?(:age=)
# => true
Person.attribute_method?(:nothing)
# => false

ソースコード

ソースコード検索

例外が発生するかチェック(instance_method_already_implemented?)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

例外が発生するかチェックする

使い方

モデル.instance_method_already_implemented?(属性)

class Person < ActiveRecord::Base
  def save
    'already defined by Active Record'
  end
end

Person.instance_method_already_implemented?(:save)
# => ActiveRecord::DangerousAttributeError: save is defined by ActiveRecord

Person.instance_method_already_implemented?(:name)
# => false

ソースコード

ソースコード検索

データの大きなモデルに対して件数を指定してeachをする場合(find_in_batches)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

分割してレコードを取得して処理をする。
デフォルトで1000件ずつ処理をする。

使い方

モデル.find_in_batches([オプション]) do |i|
end

オプション

オプション説明
:start処理開始位置
:batch_size同時処理数

Person.where("age > 21").find_in_batches do |group|
  sleep(50) # Make sure it doesn't get too crowded in there!
  group.each { |person| person.party_all_night! }
end
Person.all.find_in_batches(start: 2000, batch_size: 2000) do |group|
  group.each { |person| person.party_all_night! }
end

ソースコード

ソースコード検索

主キーを取得(ids)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

主キーを取得する

使い方

モデル.ids

Person.ids
# SELECT people.id FROM people
Person.joins(:companies).ids
# SELECT people.id FROM people INNER JOIN companies ON companies.person_id = people.id

ソースコード

ソースコード検索

任意のカラムの配列を取得(pluck)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

任意のカラムの配列を取得する

使い方

モデル.pluck(カラム名)

Person.pluck(:id)
# SELECT people.id FROM people
# => [1, 2, 3]
Person.pluck(:id, :name)
# SELECT people.id, people.name FROM people
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Person.uniq.pluck(:role)
# SELECT DISTINCT role FROM people
# => ['admin', 'member', 'guest']
Person.where(age: 21).limit(5).pluck(:id)
# SELECT people.id FROM people WHERE people.age = 21 LIMIT 5
# => [2, 3]
Person.pluck('DATEDIFF(updated_at, created_at)')
# SELECT DATEDIFF(updated_at, created_at) FROM people
# => ['0', '27761', '173']

ソースコード

ソースコード検索

クーロン作成(clone)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モデルのクーロンを作成する

使い方

モデル.clone

user = User.first
new_user = user.clone
user.name               # => "Bob"
new_user.name = "Joe"
user.name               # => "Joe"

user.object_id == new_user.object_id            # => false
user.name.object_id == new_user.name.object_id  # => true

user.name.object_id == user.dup.name.object_id  # => false

ソースコード

ソースコード検索

検索条件を指定して最初の1件を取得(find_by)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

検索条件を指定して、最初の1件を取得する

使い方

モデル.find_by(条件)

category_idが1の最初の値を取得
Page.find_by category_id: 1
# SELECT "pages".* FROM "pages" WHERE "pages"."category_id" = 1 LIMIT 1

ソースコード

ソースコード検索

引数で指定した要素数を取得(take)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

引数で指定した件数のレコードを取得する

使い方

モデル.take([件数])

Person.take
# returns an object fetched by SELECT * FROM people LIMIT 1
Person.take(5)
# returns 5 objects fetched by SELECT * FROM people LIMIT 5
Person.where(["name LIKE '%?'", name]).take

ソースコード

ソースコード検索

URLのidの部分にid以外のものを指定(to_param)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

URLのidの部分にid以外のものを指定する

使い方

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

user = User.find_by name: 'Phusion'
user_path(user)  # => "/users/Phusion"

ソースコード

ソースコード検索

update_atを更新(touch)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

update_atを現在の時刻でアップデートする。検証やコールバックを実施されない。

使い方

モデル.touch([名前])

product.touch
# updates updated_at/on
product.touch(:designed_at)
# updates the designed_at attribute and updated_at/on

ソースコード

ソースコード検索

関連オブジェクトから新しいモデルを作成(create_with)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

関連オブジェクトから新しいモデルを作成する。
「nil」を引数で渡すと属性をリセットすることができる。

使い方

モデル.create_with(属性)

関連オブジェクトから新しいモデルを作成
users = User.where(name: 'Oscar')
users.new.name # => 'Oscar'

users = users.create_with(name: 'DHH')
users.new.name # => 'DHH'
属性をリセット
users = users.create_with(nil)
users.new.name # => 'Oscar'

ソースコード

ソースコード検索

テーブルの外部結合(eager_load)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

指定したテーブルのすべてのデータを取得する

使い方

モデル.eager_load(属性)

User.eager_load(:posts)
=> SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ...
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" =
"users"."id"

ソースコード

ソースコード検索

scopeを使ってモデルを拡張(extending)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

モジュールやブロックメソッドを引数に与えて、モデルをscopeで拡張する。
返されたオブジェクトをさらに拡張することもできる。

使い方

モデル.extending(モジュール)
モデル.extending(ブロック)

モジュール
module Pagination
  def page(number)
    # pagination code goes here
  end
end

scope = Model.all.extending(Pagination)
scope.page(params[:page])
ブロック
module Pagination
  def page(number)
    # pagination code goes here
  end
end

scope = Model.all.extending do
  def page(number)
    # pagination code goes here
  end
end
scope.page(params[:page])

ソースコード

ソースコード検索

レコードが参照されるテーブルを指定(from)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

レコードが参照されるテーブルを指定する。

使い方

モデル.from(値 [, サブクエリ])

Topic.select('title').from('posts')
#=> SELECT title FROM posts
Topic.select('title').from(Topic.approved)
# => SELECT title FROM (SELECT * FROM topics WHERE approved = 't') subquery
Topic.select('a.title').from(Topic.approved, :a)
# => SELECT a.title FROM (SELECT * FROM topics WHERE approved = 't') a

ソースコード

ソースコード検索

空のモデルを取得(none)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

空のモデルオブジェクトを取得する

使い方

モデル.none()

@posts = current_user.visible_posts.where(name: params[:name])
# => the visible_posts method is expected to return a chainable Relation

def visible_posts
  case role
  when 'Country Manager'
    Post.where(country: country)
  when 'Reviewer'
    Post.published
  when 'Bad User'
    Post.none # => returning [] instead breaks the previous code
  end
end

ソースコード

ソースコード検索

読み込み専用で取得(readonly)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

読み込み専用として、モデルオブジェクトを取得する

使い方

モデル.readonly(値)

users = User.readonly
users.first.save
=> ActiveRecord::ReadOnlyRecord: ActiveRecord::ReadOnlyRecord

ソースコード

ソースコード検索

重複のないレコードを取得(uniq)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

重複のないレコードを取得する

使い方

モデル.uniq(値)

User.select(:name)
# => Might return two records with the same name

User.select(:name).uniq
# => Returns 1 record per unique name

User.select(:name).uniq.uniq(false)
# => You can also remove the uniqueness

ソースコード検索

条件式に一致しないものを取得(not)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

WHEREと一緒に使用し、条件式に一致しないものを取得する

使い方

モデル.where.not(条件)

User.where.not("name = 'Jon'")
# SELECT * FROM users WHERE NOT (name = 'Jon')
User.where.not(["name = ?", "Jon"])
# SELECT * FROM users WHERE NOT (name = 'Jon')
User.where.not(name: "Jon")
# SELECT * FROM users WHERE name != 'Jon'
User.where.not(name: nil)
# SELECT * FROM users WHERE name IS NOT NULL
User.where.not(name: %w(Ko1 Nobu))
# SELECT * FROM users WHERE name NOT IN ('Ko1', 'Nobu')
User.where.not(name: "Jon", role: "admin")
# SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'

ソースコード

ソースコード検索

検索条件を指定して初めの1件を取得し、1件もなければ作成(find_or_create_by)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

検索条件を指定して初めの1件を取得し、1件もなければ作成する

使い方

モデル.find_or_create_by(条件)

# Find the first user named Penélope or create a new one.
User.find_or_create_by(first_name: 'Penélope')
# => <User id: 1, first_name: 'Penélope', last_name: nil>

# Find the first user named Penélope or create a new one.
# We already have one so the existing record will be returned.
User.find_or_create_by(first_name: 'Penélope')
# => <User id: 1, first_name: 'Penélope', last_name: nil>

# Find the first user named Scarlett or create a new one with a particular last name.
User.create_with(last_name: 'Johansson').find_or_create_by(first_name: 'Scarlett')
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

# Find the first user named Scarlett or create a new one with a different last name.
# We already have one so the existing record will be returned.
User.find_or_create_by(first_name: 'Scarlett') do |user|
  user.last_name = "O'Hara"
end
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

ソースコード

ソースコード検索

取得する時のSQLを表示(to_sql)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

取得する時のSQLを表示する

使い方

モデル.to_sql()

User.where(name: 'Oscar').to_sql
# => SELECT "users".* FROM "users"  WHERE "users"."name" = 'Oscar'

ソースコード

ソースコード検索