リア充爆発日記

You don't even know what ria-ju really is.

Railsのenumをmodel横断的に使おうとしたときのメモ

複数のモデルにステータスなどの共通した値と処理を持たせたい!と思ってRails4.1のenumを使いつつ、concernなmoduleに切り出そうと思ったら、enumActiveRecord所属だったので、困ってしまったときのメモ。

しょうがないので、ActiveRecordを継承したクラスを作ってそこに処理をまとめようとした。

class StatusRecord < ActiveRecord::Base
  before_create :set_status

  enum status: {draft: 0, published: 1}

  private

  def set_site
    self.status = some_helper_method
  end
end

class Article < StatusRecord
~snip~
end

そしたら、statusってテーブルがねーよッ、というニュアンスにエラーがでた。

ActiveRecord::StatementInvalid:
Mysql2::Error: Table 'hoge.status' doesn't exist: SHOW FULL FIELDS FROM `status `

調べてみると、
self.abstract_class = true
として、紐づくテーブルがないことを宣言する必要があった。

class StatusRecord < ActiveRecord::Base
  self.abstract_class = true
  before_create :set_status

  enum status: {draft: 0, published: 1}

  private

  def set_site
    self.status = :draft
  end
end


これでOK牧場