当呈现为 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 时,如何使 colorlocale 在行级别可用?

【问题讨论】:

有很多方法,我建议使用github.com/rails-api/active_model_serializers,这样你就可以完全控制你正在序列化的内容,并且不会通过覆盖@中的as_json方法来搞砸事情987654331@模型。 【参考方案1】:

User.first.as_jsonrender 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 时,如何使存储键像模型的任何其他属性一样可访问的主要内容,如果未能解决你的问题,请参考以下文章

如何将有向无环图 (DAG) 存储为 JSON?

当Timer触发其tick时,如何使TextBox.TextChanged事件不触发?

laravel 如何呈现模型数据

如何使 UI 元素在加载时呈现,但随后依赖于按钮进行进一步更新

如何在单击时使自定义按钮键像 iPhone 按钮键一样大

如何从 JSON 文件中随机获取并将其呈现为 FlatList?