LoginSignup
3
3

More than 5 years have passed since last update.

RailsのActiveRecordで共通の親クラスを定義する時の覚書

Posted at

リハビリを兼ねて自分の思うがままにコードを書いているので、一応メモ書きを残すことにしました。
最近趣味で作っているプロダクトで、これって他のActiveRecordでも使うからConcernにするのも良いけど、
共通親クラスに定義して、他のモデルはこのクラスを継承するようにしてみようと思い、それを作ったので
サンプルを残しておく。

self.abstract_class = trueみたいに書いておかないと、hoge_basesというテーブルを探してしまう。
共通で使うメソッドは、method_missingに書いているが、created_at_ymdやupdated_at_ymdというメソッドを生やしている。

HogeBase.rb
class HogeBase < ActiveRecord::Base
  self.abstract_class = true

  ####################################################################
  ################### クラスメソッド #####################################
  ####################################################################
  class << self
  end

  ####################################################################
  ################### インスタンスメソッド #################################
  ####################################################################
  def method_missing(method_name,  *args,  &block)
    return unless method_name.to_s.end_with?("_ymd")

    method_name_except_format_value = method_name.to_s.sub!(/_ymd/, '')
    column_names = self.class.column_names.select { |column_name| column_name =~ /.*_at/ }

    return unless column_names.include?(method_name_except_format_value)

    read_attribute(method_name_except_format_value).strftime("%Y/%m/%d")
  end
end

上の例だと表示でしか使わない系だったら、decoratorに書くべきかもしれないけど、ちょっと実験的な要素も強いので一旦このままで。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3