我正在使用active_model_serializers,并希望找到一种方法来默认包含所有模型的属性,然后使用这样的东西
exclude :date_created, :first_name
Run Code Online (Sandbox Code Playgroud)
指定我不需要的那些.
到目前为止,我没有找到一种方法来指定除了文档中的属性之外的导出属性,并且通过枚举所有需要的属性来完成:
attributes :title, :body
Run Code Online (Sandbox Code Playgroud) 我在Rails中有一些模型看起来像这样:
class Issue < ActiveRecord::Base
belongs_to :reporter, class_name: 'User'
belongs_to :assignee, class_name: 'User'
has_many :comments
end
class User < ActiveRecord::Base
end
class Comment < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
像这样的序列化器:
class IssueSerializer < ActiveModel::Serializer
attributes :id
embed :ids, include: true
has_one :reporter, :embed => :ids
has_one :assignee, :embed => :ids
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name
end
class CommentSerializer < ActiveModel::Serializer
attributes :id, :body
end
Run Code Online (Sandbox Code Playgroud)
这会生成类似于以下内容的JSON:
{
"issues": [
{
"id": 6,
"reporter_id": 1,
"assignee_id": 2,
"comment_ids": [
3
]
}, …Run Code Online (Sandbox Code Playgroud) 我正在使用活动模型序列化器来从rails控制器呈现JSON响应.
我有这样的控制器动作:
def show
@foo = Foo.find(params[:id])
if @foo.user == current_user
render json: @foo, serializer: FooSerializer
else
render json: @foo, serializer: TrimmedFooSerializer
end
end
Run Code Online (Sandbox Code Playgroud)
我希望能够测试在我的Rspec控制器测试中使用了哪个序列化器.是否有可能从测试中获得对序列化器的引用?
更新:
我不认为这是正确使用序列化器.我现在在序列化程序本身中有逻辑来有条件地包含属性.控制器不应该真正关心使用哪个序列化器.
我已经将AMS(0.8)与Rails 3.2.19一起使用,但我真正为它们努力的一个地方是如何控制序列化器是否包含它们的关联.我显然使用AMS来构建JSON Api.有时,序列化程序是叶子或最远的元素,有时它是顶级的,需要包含关联.我的问题是这样做的最佳方式是什么,或者是我在下面工作的解决方案(或者是最佳解决方案).
我已经看到了一些讨论,但我发现它们非常令人困惑(并且基于版本).很明显,对于Serializer属性或关联,有一个include_XXX?每个方法,你可以在这里返回truthy或falsey语句.
这是我提出的代码 - 它是一个拥有许多wine_items的酿酒师.这是你怎么做的?
模型类:
class WineItem < ActiveRecord::Base
attr_accessible :name, :winemaker_id
belongs_to :winemaker
end
class Winemaker < ActiveRecord::Base
attr_accessible :name
has_many :wine_items
attr_accessor :show_items
end
Run Code Online (Sandbox Code Playgroud)
串行器:
class WinemakerSerializer < ActiveModel::Serializer
attributes :id, :name
has_many :wine_items
def include_wine_items?
object.show_items
end
end
class WineItemSerializer < ActiveModel::Serializer
attributes :id, :name
end
Run Code Online (Sandbox Code Playgroud)
在我的控制器中:
class ApiWinemakersController < ApplicationController
def index
@winemakers=Winemaker.all
@winemakers.each { |wm| wm.show_items=true }
render json: @winemakers, each_serializer: WinemakerSerializer, root: "data"
end
end
Run Code Online (Sandbox Code Playgroud) 我发现当我使用ActiveModel Serializers为一组包含关联的模型生成JSON时,会导致大量的SQL查询(每个关联一个).我怎么能避免这个?
我试过在控制器中做一个include:
render json: Project.includes(tasks: [:workers])
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.即使我将关系(包含)直接传递给ArraySerializer,它也无济于事.
我有一个简单的活动模型序列化器:
class ActivitySerializer < ActiveModel::Serializer
attributes :id, :title, :description, :time
has_one :category
has_one :user
end
Run Code Online (Sandbox Code Playgroud)
我也有类别和用户序列化程序,它们按预期工作.我得到这个有效载荷:
{"activities":[{"id":1,"title":"Test Activity","description":null,"time":"2014-03-01T06:05:41.027Z","category":{"id":1,"title":"Sports"},"user":{"id":1,"name":"ember"}}]}
Run Code Online (Sandbox Code Playgroud)
然而,它们似乎并没有加载到余烬中.
App.Activity = DS.Model.extend
title: DS.attr('string')
description: DS.attr('string')
time: DS.attr('date')
category: DS.belongsTo('category')
user: DS.belongsTo('user')
App.Category = DS.Model.extend
title: DS.attr('string')
activities: DS.hasMany('activity')
App.User = DS.Model.extend
name: DS.attr('string')
activities: DS.hasMany('activity')
Run Code Online (Sandbox Code Playgroud)
当我检查ember检查器时,没有加载数据.ActiveModelSerializer期望什么样的格式?它加载活动但不加载类别或用户属性.
我想获取pl/pgsql函数的结果,该函数返回一组记录和用户AMS以序列化结果.我怎样才能做到这一点?
我使用rails(5.0.1)和active_model_serializers(0.10.2).我想以某种方式有条件地序列化has_many关联:
class Question < ApplicationRecord
has_many :responses, :inverse_of => :question
end
class Response < ApplicationRecord
belongs_to :question, :inverse_of => :responses
end
class QuestionSerializer < ActiveModel::Serializer
attributes :id, :title, :created_at, :updated_at
has_many :responses
end
class ResponseSerializer < ActiveModel::Serializer
attributes :id, :title
end
Run Code Online (Sandbox Code Playgroud)
我使用jsonapi并查询http://localhost:3000/api/questions/1我得到这个回复:
回应1:
{
"data": {
"id": "1",
"type": "questions",
"attributes": {
"title": "First",
"created-at": "2017-02-14T09:49:20.148Z",
"updated-at": "2017-02-14T13:55:37.365Z"
},
"relationships": {
"responses": {
"data": [
{
"id": "1",
"type": "responses"
}
]
}
}
} …Run Code Online (Sandbox Code Playgroud) 我现在正在学习Django,我刚刚听说了Django Rest Framework(DRF)。我想知道django.core序列化程序和rest_framework序列化程序之间有什么区别。是的,我知道DRF适用于API。
python django python-3.x django-rest-framework active-model-serializers
几个月前,我已将已建立的 Rails 应用程序上的 Rails 升级到 5.2.4.2,并进行了最少的 Rails 依赖升级;该应用程序再次稳定下来,因此我们决定将所有 Rails 依赖项升级到最新的兼容版本。
现在,只要控制器对简单(非数据库模型)类进行 json 渲染调用,就会显示错误消息。
例子
这是序列化器:
class Api::MessageResponseSerializer < ApplicationSerializer
self.version = 1
attributes :message, :changes
def message
self.object[:message]
end
def changes
self.object[:changes]
end
end
Run Code Online (Sandbox Code Playgroud)
呼叫
render :json => { :message => "Not Ready Yet"}, :serializer => Api::MessageResponseSerializer
Run Code Online (Sandbox Code Playgroud)
我收到错误:
NoMethodError:
undefined method `model_name' for Hash:Class
Run Code Online (Sandbox Code Playgroud)
呼叫
render :json => [{ :message => "Not Ready Yet"}], :serializer => Api::MessageResponseSerializer
Run Code Online (Sandbox Code Playgroud)
我收到错误:
NoMethodError:
undefined method `model_name' for Array:Class
Run Code Online (Sandbox Code Playgroud)
调用(我知道这个不是正确的json,它在这里只是为了举例说明发生相同的错误)
render :json => 1, :serializer …Run Code Online (Sandbox Code Playgroud)