
[code]

    class User << ActibeRecord::Base
    
      json_column :data
    
    end
    
    class Post << ActibeRecord::Base
    
      json_column :info
    
    end
    
[/code]

このように、各モデルの対象のカラムを指定することで、保存前と値の参照の時に加工する処理を追加できるようにしたいのですがやり方がわかりません。

[code]

    class ActibeRecord::Base
      before_save :before
      after_find :after
    
      private
    
      def before
        # json_columnで指定された値を文字列にキャスト
      end
    
      def after
        # json_columnで指定された値をJSON.parseする
      end
    end
    
[/code]

こんな感じのものを`raols_root/config/initializers/json_column.rb`に設置して動かすイメージです。  
これであっていれば`json_column`で指定した値の取得方法さえわかれば実装できるような気がしてます。

それと、この`json_column`の名前はなんというのでしょうか?  
調べ方がわからずに困っています。

サンプルソースや参考サイトなどを教えていただけるとうれしいです。  
よろしくお願いします。

※ 今回はわかりやすいようにjsonを例にしましたが、実際に行いたい処理は違います。


CC BY-SA 3.0
2017-01-03T11:16:27.647
31591
2017-01-04T01:07:29.323
9149
question
ruby-on-rails ruby
Railsのモデルに共通の処理を与えたい


バリデーションの実行やデータベースへの保存などのタイミングをフックして処理を行いたい場合

Active Record コールバック  
<https://railsguides.jp/active_record_callbacks.html>

* * *

モデルの値の変更を検出したい場合

Active Model Dirtyモジュール  
<https://railsguides.jp/active_model_basics.html#dirty%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB>


CC BY-SA 3.0
2017-01-03T16:48:30.550
31594
2017-01-03T16:48:30.550
19298
31591
answer


[class_attribute](http://api.rubyonrails.org/v5.0.0/classes/Class.html#method-
i-class_attribute) はどうでしょうか。

[code]

    class ApplicationRecord < ActiveRecord::Base
      self.abstract_class = true
      class_attribute :json_column
      before_save :before
    
      private
    
      def before
        p [ self.class.json_column, self[json_column] ]
      end
    end
    
    class User < ApplicationRecord
      self.json_column = :data
    end
    
    class Post < ApplicationRecord
      self.json_column = :info
    end
    
    User.create(data: 'xxx')
    Post.create(info: 'yyy')
    
[/code]


CC BY-SA 3.0
2017-01-04T01:07:29.323
31597
2017-01-04T01:07:29.323
17037
31591
answer