ActiveRecordを継承しないクラスでもActiveRecord と同じような便利メソッドが使えるようになる優れもの。(ex validatesメソッド)
「データベースとのやりとり」を行うための機能(メソッド)を提供しています。
モデルとテーブルをつなぎ合わせることでRailsからテーブルのレコードにアクセスできるように する役割が「ActiveRecord」によって提供されています。
Article.all
Article.create(name: '記事名', ・・・, ・・・)
Article.find(3)
なので、ActiveRecordを継承しているモデルクラスでは、上記のようにallメソッドやfindメソッドやcreateメソッドなど、いろんなメソッドを使ってデータベースからデータを取得したり、データを挿入したりできます。
用語説明
FormObject
form_withのmodelオプションにActive Record以外のオブジェクトを渡すデザインパターン。
これによってモデルと1対1で紐づかないフォームを作ろうとするとFat Controllerになるのを防ぐ。
Fat Controller
コントローラが肥大化して可読性が下がること。
ではモデルに紐づかないクラス、つまりActiveRecordを継承しないクラスを作りたい時はどうするか。 DBに保存する必要はないがActiveRecordの機能は使いたいという場合にどうするか、
記事の検索フォームを例に見てみます。
app/views/admin/articles/index.html.slim
= form_with model: @search_articles_form, scope: :q, url: admin_articles_path, method: :get, html: { class: 'form-inline' } do |f|
=> f.select :category_id, Category.pluck(:name, :id) , { include_blank: true }, class: 'form-control'
=> f.select :author_id, Author.pluck(:name, :id) , { include_blank: true }, class: 'form-control'
=> f.select :tag_id, Tag.pluck(:name, :id) , { include_blank: true }, class: 'form-control'
.input-group
= f.search_field :title, class: 'form-control', placeholder: 'タイトル'
.input-group
= f.search_field :body, class: 'form-control', placeholder: "本文"
span.input-group-btn
= f.submit '検索', class: %w[btn btn-default btn-flat]