Railsがモデルに自動的に用意してくれる項目
下記の3項目は一般的にモデルでよく利用される属性なのでRailsが自動的に用意してくれます。
- ID
- 登録日時
- 更新日時
モデルのデータ型について
Railsのモデルにはデータ型があります。RDBMSが用意しているデータ型ではなくRailsがRDBMSごとの差異を吸収した抽象的な型として用意している概念のことです。Railsの内部でRDBMSのデータ型にマッピングされています。(下記はDB製品に依存しない書き方になる。)
boolean
真偽値
integer
符合付き整数
float
浮動小数点数
string
短い文字列を扱う。
text
長い文字列を扱う。
date
日付
datetime
日時
scope(名前付きスコープ)
上記の絞り込み条件のメソッドはカスタム用のクエリーとしてscopeというメソッドを使えばソースを読みやすくできます。別名で「名前付きスコープ」とも呼びます。
用途
再利用できそうなパーツをscopeとして定義するために利用します。なお、ちょっとしたwhereのように簡単なパーツであっても場合によっては外出しするために利用したりします。ただ、例えば「order(:カラム名)」のように単純すぎる内容のものに関しては不要でしょう。(order(:カラム desc)とかで最新のものを取得するレベルなら必要かも。)
実装例
下記の記述をモデルファイル(models/モデルオブジェクト.rb)に記述します。
1 |
scope :カスタムクエリー名, -> {条件} |
例えば、Userというモデルに下記のカスタクエリーを定義したとします。
1 |
scope :whereAdmin, -> { where{name:'admin'}} |
ソースの方では下記のように使えたりします。
1 |
user.whereAdmin.first |
命名
scopeの命名は「in_xxx」とすることが多いようです。
クラスメソッド
クラス全体で使えるメソッドです。モデルクラス全体を扱います。(例えば、ユーザーの一覧情報)
モデル内にクラスメソッド を定義したらscopeとは機能的に全く同じになります。ただ、scopeよりも行数が長くなってしまうので一般的にはクラスメソッド よりはscopeが好まれます。
1 2 3 4 5 |
class モデルクラス名 def self.メソッド名 where(カラム名: 値) end end |
インスタンスメソッド
インスタンスで使えるメソッドです。特定のインスタンスを扱います。(例えば、特定のユーザー等)、例えば、下記のようにself.カラム名と指定することで特定インスタンスのカラム名を返すメソッドになります。
1 2 3 4 5 |
class モデルクラス def メソッド名 self.カラム名 end end |
委譲とは?
ソースの記述量を減らすことができる機能です。
使い方
class内に下記のように定義します。
1 |
delegate :インスタンスメソッド, to: :メソッド名(このメソッドが返すオブジェクトにインスタンスメソッドを委譲する。) |
具体例
1 |
delegate :raw, to: :view_context |
rawというメソッドをview_contextメソッドが返すオブジェクトに委譲します。この場合、view_contextは全てのviewヘルパーを所有しているので当然のごとくrawメソッドを使うことができます。
委譲定義前
1 2 |
view_context.raw('あいう') view_context.raw('えお') |
委譲定義後
1 2 |
raw('あいう') raw('えお') |
この記事へのコメントはありません。