【问题标题】:ActiveModel Serializer with has_and_belongs_to_many带有 has_and_belongs_to_many 的 ActiveModel 序列化器
【发布时间】:2016-04-20 19:07:08
【问题描述】:

我有一个名为 Event 的模型。一个事件 has_and_belongs_to_many :event_sub_categories 和一个 EventSubCategory has_and_belongs_to_many :events。我有以下操作:

def index
    @events = Event.where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json
    render json: @events
end

该操作完全根据需要返回数据,除了一个问题,它没有子类别。我需要 json 来包含子类别。我尝试制作以下 ActiveModel 序列化器:

 class EventSerializer < ActiveModel::Serializer
   attributes :id, :name, :event_sub_categories
 end

但上面的序列化程序根本不会改变 json。我该如何解决这个问题?

【问题讨论】:

  • 什么是subcategories,它们与events 有什么关系?
  • 我更新了问题。抱歉,我写的时候搞砸了,当我的意思是“event_sub_category”时,我输入了“耐心”。现在问题应该更清楚了。

标签: ruby-on-rails ruby ruby-on-rails-4 active-model-serializers rails-api


【解决方案1】:

试试

class EventSerializer < ActiveModel::Serializer
  attributes :id, :name 
  has_many :event_sub_categories
end

【讨论】:

  • 我认为你应该删除 @events = Event.where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json 中的 to_json,因为 activemodelserializer 会自动为你处理它
  • 你使用的是完整的 rails 还是 rails api?
  • 这个答案是正确的,同时删除了方法第一行末尾的.to_a.to_json。如果您在模型上调用 to_json,AMS 将不会启动。
  • 我需要它在一个数组中。客户端的 Angular 需要一个数组。此外,删除 .to_a.to_json 无论如何也不能解决它:(
  • 是 group_by 做的,但我需要以这种方式对信息进行分组。
【解决方案2】:

试试这个:

1- 在您的控制器中以包含 event_sub_categories 的方式修改查询:

def index
    @events = Event.includes(:event_sub_categories).where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json
    render json: @events
end

2- 为 EventSubCategory 模型创建一个序列化器

3- 在您的事件序列化程序中创建方法 event_sub_categories

class EventSerializer < ActiveModel::Serializer
   attributes :id, :name, :event_sub_categories

   def event_sub_categories
     object.event_sub_categories.map do |sub_category|
       EventSubCategorySerializer.new(sub_category)
     end
   end
 end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多