Rails序列化程序 - 使用选择性包含/排除控制关联的属性

时间:2017-11-30 05:10:46

标签: ruby-on-rails serialization

我有2个资源 - postauthorpost有一个author。当我获取帖子详细信息时,我想有选择地包括作者的详细信息。

示例 -

GET /authors/1

{
  'id': 1,
  'name': 'Some name',
  'email': 'admin@example.com',
  'address': 'Some address',
  'mobile': '',
  'language': 'ruby'
}

GET /posts/1

我想 -

{
  'id': 1,
  'created_at': '2017-01-01 10:00:00',
  'views': 7500,
  'seo_score': 4,
  'author': {
    'id': 1,
    'name': 'Some name',
    'email': 'admin@example.com'
  }
}

代替,

{
  'id': 1,
  'created_at': '2017-01-01 10:00:00',
  'views': 7500,
  'seo_score': 4,
  'author': {
    'id': 1,
    'name': 'Some name',
    'email': 'admin@example.com',
    'address': 'Some address',
    'mobile': '',
    'language': 'ruby'
  }
}
  • 我想知道是否可以使用includeexcludeonly等选择序列化程序中的关联属性。

  • 我知道我可以编写一个单独的序列化程序并在定义它时将其映射到关联,但只是包含2个特定属性我不认为添加单独的类是有意义的。

  • 我也知道我可以覆盖关联并获取所有属性并有选择地选择一些;但是我想知道Serializers默认是否支持这个。

1 个答案:

答案 0 :(得分:0)

您可以使用所选列创建新关联,例如

belongs_to :author_with_partial_details, -> { select [:id, :name, :email] }, :class_name => "Author"

并使用类似这样的东西

Post.find(params[:id]).includes(:author_with_partial_details)

或者您也可以使用jbuilder gem创建自己的JSON结构,这里是指向gem https://github.com/rails/jbuilder的链接