我目前正在使用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中。
我有什么方法可以使用活动模型序列化器获取具有虚拟属性和关联对象的对象。
提前感谢您的帮助!
答案 0 :(得分:1)
我只需要添加&#34;虚拟&#34; foo_serializer中的属性并替换&#34; foo.to_json(:methods =&gt;:virtual)&#34;只是&#34; foos&#34;