当我想从一个资源中删除这些数据时,我会:
@teams = Team.all
render json: @teams, :except => [:created_at, :updated_at],
Run Code Online (Sandbox Code Playgroud)
我怀疑的是,当我有许多像这样的包括:
@teams = Team.all
render json: @teams, :include => [:stadiums, :scores, :links, :rounds]
Run Code Online (Sandbox Code Playgroud)
如何从所有这些中删除?
更正:你可以做类似的事情
render json: @teams.to_json(:except => [:created_at, :updated_at], :include => { :stadiums => { :except => [:created_at, :updated_at]}, ... })
Run Code Online (Sandbox Code Playgroud)
没有迭代相关模型,获取属性哈希并选择所需属性,没有简单的方法可以做到这一点.
这些用例通常使用json模板DSL(如jbuilder或rabl)优雅地解决.
使用jbuilder来说明这一点:
Jbuilder.encode do |json|
json.array! @teams do |team|
json.name team.name
json.stadiums team.stadiums do |stadium|
json.name stadium.name
# Other relevant attributes from stadium
end
# Likewise for scores, links, rounds
end
end
Run Code Online (Sandbox Code Playgroud)
哪个会产生输出:
[{
name: "someteamname",
stadiums: {
name: "stadiumname"
},
...
}, {...},...]
Run Code Online (Sandbox Code Playgroud)
如果您发现这个用例过于冗长,正如@liamneesonsarmsauce在评论中指出的那样另一种解决方案是使用ActiveModel Serializers
使用此方法,您可以为每个模型指定一个序列化程序类,列出允许的属性,这些属性将成为json响应的一部分.例如
class TeamSerializer < ActiveModel::Serializer
attributes :id, :name # Whitelisted attributes
has_many :stadiums
has_many :scores
has_many :links
has_many :rounds
end
Run Code Online (Sandbox Code Playgroud)
您也可以为关联模型定义类似的序列化程序.
由于关联是以rails开发人员已经熟悉的方式无缝处理的,除非您需要对生成的json响应进行大量自定义,否则这是一种更简洁的方法.
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |