标签: active-model-serializers

具有嵌入式ID和侧载的Ember-Data和Active Model Serializer的has_many配置

我知道Ember-Data应该与Active Model Serializers兼容,但它们似乎与序列化has_many与嵌入式ID的关系不合时宜.

例如,序列化器

class PostSerializer < ActiveModel::Serializer
  embed :ids
  has_many :comments
end
Run Code Online (Sandbox Code Playgroud)

生成JSON

{
    "post": {
        "comment_ids": [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

但是Ember Data中的默认配置,

App.Post = DS.Model.extend({
  DS.hasMany('App.Comment'),
});

App.Comment = DS.Model.extend();
Run Code Online (Sandbox Code Playgroud)

期望注释关联序列化为comments: [...]没有_ids后缀(请参阅Ember.js指南的REST适配器部分的关系子部分).

我尝试了以下作为解决方法:

class PostSerializer < ActiveModel::Serializer
  attribute :comments
  def comments
    object.comment_ids
  end
end
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是embed :ids, :include => true为了启用侧载而添加现在什么都不做,因为AMS不知道它是一个关联.

编辑:我正在使用active_model_serializers (0.6.0)gem和Ember-Data修订版11

ruby-on-rails ember.js ember-data active-model-serializers

6
推荐指数
1
解决办法
4538
查看次数

Ember.JS ActiveModelAdapter和Active Model Serializers的默认行为

我有一个简单的活动模型序列化器:

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期望什么样的格式?它加载活动但不加载类别或用户属性.

ember.js ember-data active-model-serializers

6
推荐指数
1
解决办法
2776
查看次数

缓存序列化程序,无法缓存关联

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

服务序列化器

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
Run Code Online (Sandbox Code Playgroud)

输出"y ServiceSerializer.new(Service.first)"

object: !ruby/ActiveRecord:Service
  attributes:
    id: 4
    name: ADHD …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails active-model-serializers ruby-on-rails-4

6
推荐指数
1
解决办法
2385
查看次数

如何使用Rails Serializer返回对象的所有属性?

我有一个简单的问题.我有一个如下所示的序列化器:

class GroupSerializer < ActiveModel::Serializer
  attributes :id, :name, :about, :city 
end
Run Code Online (Sandbox Code Playgroud)

问题在于,每当我更改模型时,我都必须在此序列化程序中添加/删除属性.我只是想默认获取整个对象,因为默认的rails json响应:

render json: @group
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

ruby-on-rails active-model-serializers

6
推荐指数
1
解决办法
3926
查看次数

如何将参数传递给ActiveModel :: ArraySerializer?

我需要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
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我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
Run Code Online (Sandbox Code Playgroud)

active-model-serializers ruby-on-rails-4

6
推荐指数
2
解决办法
3964
查看次数

ActiveModelSerializers Polymorphic Json

一直在试图让多态序列化器通过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
Run Code Online (Sandbox Code Playgroud)

使用Rspec测试ActiveModel :: Serializer类

class MediaSerializer < ApplicationSerializer
  attributes :id,
             :label,

  has_one :asset, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)

我注意到测试似乎甚至没有正确添加多态标识符(即asset_id,asset_type - 或在测试用例中imageable_id,imageable_type)

https://github.com/rails-api/active_model_serializers/commit/045fa9bc072a04f5a94d23f3d955e49bdaba74a1#diff-c3565d7d6d40da1b2bf75e13eb8e6afbR36

如果我直接向上看MediaSerialzer.new(媒体)我可以查看.associations,但我似乎无法让它们渲染,好像我正在生成一个完整的有效载荷

来自文档 https://github.com/rails-api/active_model_serializers

serializer_options = {}
serializer = SomeSerializer.new(resource, serializer_options)
serializer.attributes
serializer.associations
Run Code Online (Sandbox Code Playgroud)

我很确定我错过了什么/做错了什么 - 任何指导都会很棒.

谢谢

polymorphism json active-model-serializers

6
推荐指数
1
解决办法
261
查看次数

active_model_serializer 0.10.0.rc5中的ActiveModel :: Serializer :: CollectionSerializer :: NoSerializerError

我正在使用active_model_serializer 0.10.0.rc5grape 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
Run Code Online (Sandbox Code Playgroud)

我的序列化程序看起来像这样:

class V1::Serializers::PostSerializer < ActiveModel::Serializer
  attributes :id, :name, :slug
end
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试访问post端点时,我收到以下错误:

ActiveModel::Serializer::CollectionSerializer::NoSerializerError - No serializer found for resource:
Run Code Online (Sandbox Code Playgroud)

我在调试问题时想出的问题在于CollectionSerializer#initialize这个gem.我想这个serializer_class变量是零.

我已经尝试了几乎所有与此问题相关的链接.但没有一个对我有用.

active-model-serializers ruby-on-rails-4 grape-api

6
推荐指数
1
解决办法
2931
查看次数

Rails 5 - 对象关系Impedence以及如何构造多个继承的类/表

编辑 我已经从原版编辑了这个,以便更容易理解.


我理解对象关系阻抗问题.我理解Rails STI和多态(Rails方式,它不是真正的OO多态).我已经阅读了一大堆关于此的博客和问题,但仍无法找到这个问题的答案.

class Person < ApplicationRecord (ie what was ActiveRecord::Base)
end

class Employee < Person
end

class Customer < Person
end
Run Code Online (Sandbox Code Playgroud)

......多种其他类型的人

现在让我们说'客户'要求扩展系统,并创建一些新东西.我们称之为项目,我们可以为其分配员工:

好的,让我们使用第三范式创建多对多:

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
Run Code Online (Sandbox Code Playgroud)

这不行.迁移将失败,因为没有名为Employee的表来创建外键约束.STI意味着'基类'是People表.

两个问题:

1你怎么解决这个问题?(为此你可能还想在这里筹码)

2如何为项目(应包括员工,但不包括人员或人员的其他子类型)正确创建序列化数据?

ProjectSerializer < ActiveModelSerializers

  has_many :employees
  has_many :employees, through: :assignments

end
Run Code Online (Sandbox Code Playgroud)

不会工作,所以你必须序列化人.


UPDATE


在迁移中,我创建了Project和Assignment表(Person已经存在).

所以现在数据库有这些表:

Project
Person
Assignment …
Run Code Online (Sandbox Code Playgroud)

many-to-many ruby-on-rails sti active-model-serializers

6
推荐指数
1
解决办法
418
查看次数

获取Rails 5应用程序以返回JSON API格式

我正在尝试让我的应用程序以小写的camelcase返回以进行最终的JSON API格式化.

我安装gem 'active_model_serializers'并创建了一个新的初始化程序,其中包含以下代码:

ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower
Run Code Online (Sandbox Code Playgroud)

然后我有一个返回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
Run Code Online (Sandbox Code Playgroud)

有关API控制器继承模式的更多信息: class API::V1::BaseController < ActionController::Base

问题

在我的API响应中,事情仍然是蛇形的,我在控制台中看到了这个错误,[active_model_serializers] Rendered ActiveModel::Serializer::Null但是我的研究让我陷入了死胡同.

任何建议都会非常受欢迎.谢谢!

ruby-on-rails active-model-serializers json-api

6
推荐指数
1
解决办法
1104
查看次数

活动模型序列化程序:在呈现为关系时排除属性

TL; 博士

使用: gem 'active_model_serializers', '~> 0.10.7'

当作为关系包含时,有没有办法从序列化程序中包含/排除选项?像这样的东西:

has_many :options, only: [:id, :name]
Run Code Online (Sandbox Code Playgroud)

?

细节

我有一个序列化程序:

class ProductSerializer < BaseSerializer
  attribute :id, :name

  has_many :options
end
Run Code Online (Sandbox Code Playgroud)

Option 有自己的序列化程序,其中包括其他几个属性

class OptionSerializer < BaseSerializer
  attribute :id, :name, :created_at, :updated_at
end
Run Code Online (Sandbox Code Playgroud)

但是,在Product关系中呈现时,我从序列化程序中获得了所有选项。但是当列为关系的一部分时(而不是单独列出),我只想要id并被name展示。像这样:

{
  "products": [{
    "id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
    "name": "foo",
    "options": [{
      "id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
      "name": "bar"
    }]
...
}
Run Code Online (Sandbox Code Playgroud)

如果我覆盖关系,我可以到达那里:

def options
  object.options.select(:id, :name)
end
Run Code Online (Sandbox Code Playgroud)

...但是 1)这感觉很草率,2)这会产生 N+1 个问题。我也可以创建一个NestedOptionSerializer然后使用它来渲染,但这似乎有点矫枉过正。

当序列化程序作为关系包含时,是否有更简单/更清晰的包含/排除属性的方法?像这样的东西?

has_many :options, only: [:id, …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails active-model-serializers

5
推荐指数
1
解决办法
1622
查看次数