Ruby on rails 如何将两个as_json方法正确组合为一个?

Ruby on rails 如何将两个as_json方法正确组合为一个?,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,在我的模型中,我有一个working as_json方法,如下所示: def as_json(options = {}) super(options.merge(include: [:user, comments: {include: :user}])) end 此方法用于在注释中包含用户 现在,我需要在同一个模型中添加几乎相同的内容以获得答案: def as_json(options = {}) super(options.merge(include: [:use

在我的模型中,我有一个working as_json方法,如下所示:

  def as_json(options = {})
    super(options.merge(include: [:user, comments: {include: :user}]))
  end
此方法用于在注释中包含用户

现在,我需要在同一个模型中添加几乎相同的内容以获得答案:

  def as_json(options = {})
    super(options.merge(include: [:user, answers: {include: :user}]))
  end
如何将这两个as_-json方法结合起来,从而得到一个as_-json方法?

别笑,我已经挣扎了三天了

def as_json(other_arg, options = {})
  as_json(options.merge(include: [:user, other_arg: {include: :user}])) 
end
然后你可以打电话:

MyModel.as_json(:comments)
MyModel.as_json(:answers)

为什么要覆盖核心Rails功能?除非绝对必要,否则这不是一个好的实践

--

他说:

要包含关联,请使用:include:

你可以打电话:

@answers.as_json(include :users)
@answers.to_json(include: comments: { include: :users })
--

哦,啊,啊,

二级和更高级别的关联也起作用:

看来你可以打电话:

@answers.as_json(include :users)
@answers.to_json(include: comments: { include: :users })

这就是为什么不应该使用内置的
to_json
来序列化ActiveRecord模型的原因之一

相反,您应该将任务委托给另一个名为serializer的对象。使用序列化程序可以使您拥有同一对象的非无限表示法(序列化)(如果对象可以有不同的变体,例如有/没有注释等,则很有用)和关注点分离

创建自己的序列化程序很简单,就像拥有

class ModelWithCommentsSerializer
  def initialize(object)
    @object = object
  end

  def as_json
    @object.as_json(include: [:user, comments: {include: :user}])) 
  end
end

class ModelWithAnswersSerializer
  def initialize(object)
    @object = object
  end

  def as_json
    @object.as_json(include: [:user, answers: {include: :user}])) 
  end
end
当然,这只是一个例子。可以提取特征以避免重复


也有提供该功能的gems,但我更愿意避免使用它们,因为它们往往提供了大多数用户真正需要的更多功能。

我该将其称为何处?您可以称为Model.as_json(:comments)或Model.as_json(:answers),但是我认为Rich Peck的解决方案会更好这是在上面的示例中调用这个序列化器模型的正确方法吗
ModelWithCommentsSerializer.new(我的用户实例)
ModelWithCommentsSerializer.new(我的用户实例)。作为json
或者它取决于您如何定义序列化程序。好吧,我一直在说:“创建自己的序列化程序简直是愚蠢的”。应该在哪里定义示例中的这个序列化器类?如果你能给我一个链接,那就太好了。我只找到与ActiveModelSerializers相关的东西。我将使用ActiveModelSerializers,感谢您指出这一点。