我知道Ember-Data应该与Active Model Serializers兼容,但它们似乎与序列化has_many与嵌入式ID的关系不合时宜.
例如,序列化器
class PostSerializer < ActiveModel::Serializer
  embed :ids
  has_many :comments
end
生成JSON
{
    "post": {
        "comment_ids": [...]
    }
}
但是Ember Data中的默认配置,
App.Post = DS.Model.extend({
  DS.hasMany('App.Comment'),
});
App.Comment = DS.Model.extend();
期望注释关联序列化为comments: [...]没有_ids后缀(请参阅Ember.js指南的REST适配器部分的关系子部分).
我尝试了以下作为解决方法:
class PostSerializer < ActiveModel::Serializer
  attribute :comments
  def comments
    object.comment_ids
  end
end
它可以工作,但是embed :ids, :include => true为了启用侧载而添加现在什么都不做,因为AMS不知道它是一个关联.
编辑:我正在使用active_model_serializers (0.6.0)gem和Ember-Data修订版11
我有一个简单的活动模型序列化器:
class ActivitySerializer < ActiveModel::Serializer
  attributes :id, :title, :description, :time
  has_one :category
  has_one :user
end
我也有类别和用户序列化程序,它们按预期工作.我得到这个有效载荷:
{"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"}}]}
然而,它们似乎并没有加载到余烬中.
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')
当我检查ember检查器时,没有加载数据.ActiveModelSerializer期望什么样的格式?它加载活动但不加载类别或用户属性.
我正在尝试使用Active Model Serializer实现一些缓存; 这是我的序列化器.
class ServiceFieldSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :meta_description, :content, :practitioner_term, :avatar, :slug
  has_many :services
  embed :id, include: true
  cached
  delegate :cache_key, to: :object
  def services
    object.services.published
  end
  def avatar
    object.image_url :avatar if object.image.present?
  end
end
服务序列化器
class ServiceSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :meta_description, :content, :practitioner_term, :avatar, :slug
  has_one :service_field
  embed :id
  cached
  delegate :cache_key, to: :object
  def avatar
    object.image_url :avatar if object.image.present?
  end
end
输出"y ServiceSerializer.new(Service.first)"
object: !ruby/ActiveRecord:Service
  attributes:
    id: 4
    name: ADHD …我有一个简单的问题.我有一个如下所示的序列化器:
class GroupSerializer < ActiveModel::Serializer
  attributes :id, :name, :about, :city 
end
问题在于,每当我更改模型时,我都必须在此序列化程序中添加/删除属性.我只是想默认获取整个对象,因为默认的rails json响应:
render json: @group
我怎样才能做到这一点?
我需要current_user_id从ItemSerializer中访问.有没有办法实现它?我很好,即使是一个肮脏的黑客:)
我知道serialization_options哈希的存在(从如何将参数传递给ActiveModel序列化程序 
),但它只适用于render命令(如果我是对的),所以可以这样做:
def action
  render json: @model, option_name: value
end
class ModelSerializer::ActiveModel::Serializer
  def some_method
    puts serialization_options[:option_name]
  end
end
但在我的情况下,我ArraySerializer用来生成render命令之外的json哈希,如下所示:
positions_results = {}    
positions_results[swimlane_id][column_id] =
  ActiveModel::ArraySerializer.new(@account.items,
                                   each_serializer: ItemSerializer,
                                   current_user_id: current_user.id) # <---- Does not work
一直在试图让多态序列化器通过rspec工作和测试数据.刚刚升级到0.10+
我发现这篇文章很有意义,并确实给了我一个生成序列化的条目,但是,当为多态形式做这个时,我从来没有得到正确命名的类型和id(期望看到asset_id和asset_type嵌套)
{:id=>1,
  :label=>"Today I feel amazing!",
  :position=>0,
  :status=>"active",
  :media_container_id=>1,
  :asset=>
    {:id=>4
使用Rspec测试ActiveModel :: Serializer类
class MediaSerializer < ApplicationSerializer
  attributes :id,
             :label,
  has_one :asset, polymorphic: true
end
我注意到测试似乎甚至没有正确添加多态标识符(即asset_id,asset_type - 或在测试用例中imageable_id,imageable_type)
如果我直接向上看MediaSerialzer.new(媒体)我可以查看.associations,但我似乎无法让它们渲染,好像我正在生成一个完整的有效载荷
来自文档 https://github.com/rails-api/active_model_serializers
serializer_options = {}
serializer = SomeSerializer.new(resource, serializer_options)
serializer.attributes
serializer.associations
我很确定我错过了什么/做错了什么 - 任何指导都会很棒.
谢谢
我正在使用active_model_serializer 0.10.0.rc5和grape gemapi.  
我有一个这样的帖子端点:
class V1::Endpoints::Posts < Grape::API
  resource :posts do
    desc 'Returns a list of posts.'
    # serializing array
    get '', each_serializer: V1::Serializers::PostSerializer  do
      @posts = Post.all
      present @posts
    end
  end
end
我的序列化程序看起来像这样:
class V1::Serializers::PostSerializer < ActiveModel::Serializer
  attributes :id, :name, :slug
end
现在,当我尝试访问post端点时,我收到以下错误:
ActiveModel::Serializer::CollectionSerializer::NoSerializerError - No serializer found for resource:
我在调试问题时想出的问题在于CollectionSerializer#initialize这个gem.我想这个serializer_class变量是零.
我已经尝试了几乎所有与此问题相关的链接.但没有一个对我有用.
编辑 我已经从原版编辑了这个,以便更容易理解.
我理解对象关系阻抗问题.我理解Rails STI和多态(Rails方式,它不是真正的OO多态).我已经阅读了一大堆关于此的博客和问题,但仍无法找到这个问题的答案.
class Person < ApplicationRecord (ie what was ActiveRecord::Base)
end
class Employee < Person
end
class Customer < Person
end
......多种其他类型的人
现在让我们说'客户'要求扩展系统,并创建一些新东西.我们称之为项目,我们可以为其分配员工:
好的,让我们使用第三范式创建多对多:
class Project < ApplicationRecord
  has_many :assignments
  has_many :employees, through: :assignments  
end
class Employee < Person
  has_many :assignments
  has_many :projects, through: :assignments
end
class Assignment < ApplicationRecord
  belongs_to :employee
  belongs_to :project
end
这不行.迁移将失败,因为没有名为Employee的表来创建外键约束.STI意味着'基类'是People表.
两个问题:
1你怎么解决这个问题?(为此你可能还想在这里筹码)
2如何为项目(应包括员工,但不包括人员或人员的其他子类型)正确创建序列化数据?
ProjectSerializer < ActiveModelSerializers
  has_many :employees
  has_many :employees, through: :assignments
end
不会工作,所以你必须序列化人.
UPDATE
在迁移中,我创建了Project和Assignment表(Person已经存在).
所以现在数据库有这些表:
Project
Person
Assignment …我正在尝试让我的应用程序以小写的camelcase返回以进行最终的JSON API格式化.
我安装gem 'active_model_serializers'并创建了一个新的初始化程序,其中包含以下代码:
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower
然后我有一个返回json的小API,就像所有最好的互联网应用程序一样:
class Api::V1::UsersController < API::V1::BaseController
  def sky
      @user = User.find_by_id(params[:user_id])
      if @user
          obj =  {
              sky: {
                  sectors: @user.sectors,
                  slots: @user.slots
              }
          }
          render json: obj
      else
          raise "Unable to get Sky"
      end
  end
有关API控制器继承模式的更多信息: class API::V1::BaseController < ActionController::Base
问题
在我的API响应中,事情仍然是蛇形的,我在控制台中看到了这个错误,[active_model_serializers] Rendered ActiveModel::Serializer::Null但是我的研究让我陷入了死胡同.
任何建议都会非常受欢迎.谢谢!
使用: gem 'active_model_serializers', '~> 0.10.7'
当作为关系包含时,有没有办法从序列化程序中包含/排除选项?像这样的东西:
has_many :options, only: [:id, :name]
?
我有一个序列化程序:
class ProductSerializer < BaseSerializer
  attribute :id, :name
  has_many :options
end
Option 有自己的序列化程序,其中包括其他几个属性
class OptionSerializer < BaseSerializer
  attribute :id, :name, :created_at, :updated_at
end
但是,在Product关系中呈现时,我从序列化程序中获得了所有选项。但是当列为关系的一部分时(而不是单独列出),我只想要id并被name展示。像这样:
{
  "products": [{
    "id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
    "name": "foo",
    "options": [{
      "id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
      "name": "bar"
    }]
...
}
如果我覆盖关系,我可以到达那里:
def options
  object.options.select(:id, :name)
end
...但是 1)这感觉很草率,2)这会产生 N+1 个问题。我也可以创建一个NestedOptionSerializer然后使用它来渲染,但这似乎有点矫枉过正。
当序列化程序作为关系包含时,是否有更简单/更清晰的包含/排除属性的方法?像这样的东西?
has_many :options, only: [:id, …ember-data ×2
ember.js ×2
grape-api ×1
json ×1
json-api ×1
many-to-many ×1
polymorphism ×1
sti ×1