4421


下記のようなテーブルがあるとします。

[code]

    CREATE TABLE users (
      id INT NOT NULL AUTO_INCREMEN
      name VARCHAR(32),
      created_datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    );
    
[/code]

このテーブルのカラムとは別に`hoge`という名前でUserモデルにプロパティを追加し、ActiveRecordで操作できるようにしたいと考えています。

具体的には下記のように、追加したプロパティに値をセットしjson文字列化したいです。

[code]

    users = User.all
    users.each do |u|
      u.hoge = true
    end
    
    return users.to_json
    
[/code]

* * *

`attr_accessor`を使うことで実現できるかと思い試してみましたが、値のセットはできるようになるものの、to_jsonで取得される文字列に追加したプロパティは含まれていませんでした。

[code]

    class User < ActiveRecord::Base
      attr_accessor :hoge
    end
    
[/code]

* * *

何らかの方法でテーブルにないカラムをモデルに追加することは可能でしょうか？


CC BY-SA 3.0
2015-01-11T17:17:17.200
4416
2015-01-15T14:58:10.320
2015-01-15T14:58:10.320
4978
3968
question
ruby ruby-on-rails json rails-activerecord
テーブルのカラムには存在しない独自に追加したプロパティも to_json で出力したい

[code]

    return users.to_json
    
[/code]

`to_json` を呼ぶとき、`:methods` 引数を使って

[code]

    return users.to_json(methods: :hoge)
    
[/code]

とすると `"hoge"` が含まれたJSONが返ります。


CC BY-SA 3.0
2015-01-11T17:32:01.727
4418
2015-01-11T17:32:01.727
724
4416
answer


データベースと ひもづいていない attribute をもつ方法として、virtual attribute というものがあります。  
json の構造変更や項目を追加するなら、as_jsoon を再定義する方法があります。

参考情報：  
- [railsのvirtual attributeのお話](http://stpanisush.hatenablog.com/entry/2013/07/25/114838)  
- [RailsでVirtual Attributes(仮想的な属性)をする](http://ruby-rails.hatenadiary.com/entry/20141229/1419856433)  
- [RAILSCAST – 016-VIRTUAL-ATTRIBUTES](http://patrickperey.com/railscast-016-virtual-attributes/)  
- [Add Virtual attribute to active record object to output](https://stackoverflow.com/questions/26076173/add-virtual-attribute-to-active-record-object-to-output)  
- [Rails JSON Virtual Attributes](https://jesse.sh/rails-virtual-attributes/)  
- [Build your own JSON presenters with POROs (Plain Old Ruby Object)](http://samurails.com/gems/poro-json-presenters/)


CC BY-SA 3.0
2015-01-11T21:36:27.297
4421
2015-01-11T21:36:27.297
2017-05-23T12:38:55.250
-1
2987
4416
answer