ActiveModelとは

ActiveRecordを継承しないクラスでもActiveRecord と同じような便利メソッドが使えるようになる優れもの。(ex validatesメソッド)

ActiveRecordとは

「データベースとのやりとり」を行うための機能(メソッド)を提供しています。

モデルとテーブルをつなぎ合わせることで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]