Railsのenumをmodel横断的に使おうとしたときのメモ
複数のモデルにステータスなどの共通した値と処理を持たせたい!と思ってRails4.1のenumを使いつつ、concernなmoduleに切り出そうと思ったら、enumはActiveRecord所属だったので、困ってしまったときのメモ。
しょうがないので、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牧場。