gpt4 book ai didi

ruby-on-rails - 嵌套 JSON 的存储访问器

转载 作者:行者123 更新时间:2023-12-03 07:34:26 26 4
gpt4 key购买 nike

我有存储与组织相关的所有信息的模型“组织”。有一个名为“integrations”的 JSONB 类型字段,用于存储与组织拥有的所有外部服务集成相关的信息。

如何使用存储访问器访问存储在嵌套 JSON 中的信息,例如:

{
"mailchimp": {"api_key":"vsvsvef", "list_id":"12345"},
"sendgrid" : {"username":"msdvsv", "password":"123456"}
}

我知道我可以使用这样的商店访问器访问 mailchimp:
store_accessor :integrations, :mailchimp

如何轻松访问 mailchimp 的 api_key?

最佳答案

你是对的,不幸的是store_accessor不允许您访问嵌套键。原因是store_accessor基本上只是定义 getter 和 setter 方法的快捷方式:

# here is a part of store_accessor method code, you can take a look at
# full implementation at
# http://apidock.com/rails/ActiveRecord/Store/ClassMethods/store_accessor
_store_accessors_module.module_eval do
keys.each do |key|
# here we define a setter for each passed key
define_method("#{key}=") do |value|
write_store_attribute(store_attribute, key, value)
end

# and here goes the getter
define_method(key) do
read_store_attribute(store_attribute, key)
end
end
end

因此,您的选择是:
  • 要手动实现您自己的一组 getter 和 setter 方法:
    # somewhere in your model
    def mailchimp_api_key
    self.mailchimp["api_key"]
    end

    def mailchimp_api_key= value
    self.mailchimp["api_key"] = value
    end

    这解决了一个问题,但是您必须为每个嵌套属性重复编写很多这样的内容。
  • ActiveRecord::Store::ClassMethods 中编写自己的辅助方法模块,它将为您传入的属性集动态定义相同的 setter 和 getter 方法。您必须采用 Rails store_accessor 的基本实现并向其添加额外的哈希键迭代。不确定这是否会是一件容易的事,但看到作为 gem 分享肯定会很有趣。
  • 离开 Rails 本身并使用 postgres 的力量 json带有一些纯 SQL 的类型支持代码。例如,您可以访问 api_key类似这样的属性:
    SELECT integrations->'mailchimp'->>'api_key' as mailchimp_api_key FROM your_table_name;

    有关 postgres json 查询的更多信息,请参阅 here .
  • 关于ruby-on-rails - 嵌套 JSON 的存储访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694695/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com