具有虚拟属性的活动模型序列化程序 - Rails 4

时间:2014-12-05 20:53:39

标签: ruby-on-rails ruby api ruby-on-rails-4 serialization

我目前正在使用RoR制作API,我需要使用虚拟属性和关联对象创建一个对象。

问题是当我返回具有虚拟属性的对象时,序列化程序不会启动。

这是来自foo_controller的返回对象

{
    :id=>280, 
    :virtual=>"y8st07ef7u"
    :user_id=>280
}

:virtual是虚拟属性,user_id是关联表的id - User。

我的目标是做到这一点

{
    :id=>280,
    :virtual=>"y8st07ef7u",
    :user=>{
            :id=>280,
            :name=>'foo'
    }
}

Foo_controller设置

class Api::V1::FoosController < ApplicationController
    foos = Foo.all
    foos.each do |foo|
       foo.set_attribute('y8st07ef7u')
    end
    render json: foos.to_json(:methods => :virtual), status: 200 
end

Foo_model设置

class Foo < ActiveRecord::Base

    belongs_to :user

    attr_accessor:virtual

    def set_attribute(path)
        self.virtual = path
    end
end

Foo_serializer设置

class FooSerializer < ActiveModel::Serializer
    attributes :id, :virtual
    has_one :user
end

Foo迁移设置

class CreateFoos < ActiveRecord::Migration
    def change
        create_table :foo do |t|

            t.references :user

        end
    end
end

用户模型

class User < ActiveRecord::Base  
   has_many :foos
end

用户序列化程序

class UserSerializer < ActiveModel::Serializer
    attributes :id, :name
    belongs_to :foo
end

当我替换&#34; foo.to_json(:methods =&gt;:virtual)&#34;在foo_controller中使用&#34; foos&#34;,序列化程序启动并在返回的json而不是user_id中获取用户对象,但是:virtual不在json中。

我有什么方法可以使用活动模型序列化器获取具有虚拟属性和关联对象的对象。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我发现了。这很简单。

我只需要添加&#34;虚拟&#34; foo_serializer中的属性并替换&#34; foo.to_json(:methods =&gt;:virtual)&#34;只是&#34; foos&#34;