当呈现为 JSON 时,如何使存储键像模型的任何其他属性一样可访问
Posted
技术标签:
【中文标题】当呈现为 JSON 时,如何使存储键像模型的任何其他属性一样可访问【英文标题】:How to make store keys accessible just like any other attribute of the model when rendering as JSON 【发布时间】:2017-10-15 15:15:29 【问题描述】:我在 users 表中有一个设置列(jsonb 数据类型),我想对其进行反序列化并使其可供模型访问。这是我的模型的样子。
class User < ActiveRecord::Base
store_accessor :settings, :color, :locale
end
User.first.color
有效
但User.first.as_json
不包含行级别的color
键,它在settings
内部可用。
同样render json: User.find(params[:id])
做同样的事情。
在呈现 JSON 时,如何使 color
和 locale
在行级别可用?
【问题讨论】:
有很多方法,我建议使用github.com/rails-api/active_model_serializers,这样你就可以完全控制你正在序列化的内容,并且不会通过覆盖@中的as_json
方法来搞砸事情987654331@模型。
【参考方案1】:
User.first.as_json
或 render json: User.find(params[:id])
不会得到您想要的结果。当您希望构建具有从模型函数返回的属性的 json 时,也会发生同样的情况。
我使用 Jbuilder (https://github.com/rails/jbuilder) 进行序列化。它非常适合渲染 json。
示例代码,
users_controller.rb
def function_x
@user = User.first
end
/views/function_x.json.jbuilder
json.extract! @user, :id, :other_params_from_users_table
json.color @user.color
json.locale @user.locale
现在你的 json 应该看起来像这样,
id: ....,
param1: value 1,
param2: value 2,
color: color_value,
locale: locale_value
【讨论】:
我设置了 STI,其中为所有子类定义了 store_accessor。我不喜欢必须为所有控制器定义 jbuilder 的事实。在行级别取消嵌套存储的信息在store_accessor
中可用,并且应该像 render json: User.first, include: [:roles]
一样易于使用(用户 has_many 角色)
@Mo3z 我知道已经有好几年了,但你有没有找到合适的解决方案?以上是关于当呈现为 JSON 时,如何使存储键像模型的任何其他属性一样可访问的主要内容,如果未能解决你的问题,请参考以下文章
当Timer触发其tick时,如何使TextBox.TextChanged事件不触发?