首先,您的模型扩展了ActiveRecord::Base,对吗?例如,
class Post < ActiveRecord::Base
# ...
end
ActiveRecord::Base 定义了一个as_json 方法。如果您没有在模型中定义def as_json,您仍然可以在实例上调用as_json,因为它继承其超类ActiveRecord::Base 的行为。
其次,你知道ActiveRecord::Base#as_json 接受一些选项吗?例如,使用 only: 会将 JSON 限制为您指定的属性 (doc)。
鉴于这些信息,您可以像这样致电as_json:
post.as_json(only: [:title, :published_at]) #=> {title: "...", published_at: "..."}
include: 是您可以传递给as_json 的选项之一。
第三,super 用于调用超类中的相同方法。所以,在这种情况下:
class Post < ActiveRecord::Base
def as_json(options = {})
super
end
end
super 将调用ActiveRecord::Base#as_json。这很好,因为该方法定义了这种行为!
使用no 参数调用super 只会将原始 参数传递给该方法调用。所以,这些是等价的:
def as_json(options = {})
# `options` hash is passed _implicitly_:
super
end
def as_json(options = {})
# `options` hash is passed _explicitly_:
super(options)
end
但是,如果你愿意,你可以在发送给 super 之前修改options。在您的示例中,情况就是这样:
def as_json(options = {})
# 添加include: :comments 到任何提供的选项
new_options = options.merge(包括::cmets)
# 将修改后的选项传递给super
超级(新选项)
结束
这样,您可以确保您始终将include: :comments 传递给ActiveRecord::Base 的as_json 实现!
希望有帮助!