如何使用Rails表单和JSONB Postgres进行工作

14

我打算在Rails4.2和Postgres4.1中使用新的jsonb功能。

我想要创建一个表示用户资料(例如技能等)并将整个资料存储在单个的jsonb数据集中的模型。

因此,该表将包含:

id int
profile jsonb
timestamps

我在考虑,可以将所有的个人资料数据基本上存储在以下的jsonb结构中(这只是一个示例/概念):

{
  "basics": {
    "name": "John Doe",
    "label": "Programmer",
    "picture": "",
    "email": "john@gmail.com",
    "phone": "(912) 555-4321",
    "website": "http://johndoe.com",
    "summary": "A summary of John Doe...",
    "location": {
      "address": "2712 Broadway St",
      "postalCode": "CA 94115",
      "city": "San Francisco",
      "countryCode": "US",
      "region": "California"
    },
    "profiles": [{
      "network": "Twitter",
      "username": "john",
      "url": "http://twitter.com/john"
    }]
  },
"skills": [{
    "name": "Web Development",
    "level": "Master",
    "keywords": [
      "HTML",
      "CSS",
      "Javascript"
    ]
  }],
  "languages": [{
    "language": "English",
    "fluency": "Native speaker"
  }],
}

我的问题是如何创建一个基本的Rails表单,以便写入/读取这个结构?我知道如何将其应用于传统的关系型表格,但不确定如何处理可以全部放入下面灵活结构中的情况?

_form.html.erb和控制器new / create / edit操作会发生什么?


我处于同样的情况。你找到任何解决方案了吗? - medBouzid
2个回答

10

我不知道之前的版本,但是从文档中可以看出,在Rails 6中,你可以像这样使用store:https://api.rubyonrails.org/classes/ActiveRecord/Store.html

class MyModel < ApplicationRecord
    store :my_jsonb_field_name, accessors: [:property1, :property2]
end

现在,如果你有一个表单,其中包含 <%= form.text_field :property1 %><%= form.text_field :property2 %>,它们将自动映射到你的json/jsonb字段,并且你可以像处理常规(varchar/string)字段一样处理它们。

不要忘记在strong参数中允许::property1和property2等:

params.require(:my_model).permit(:title, [...], :property1, :property2)

9

使用 store_accessors。表单数据只是一个Hash,可以很容易地转换为JSON对象并在postgresql中持久化,不会出现重大问题。

假设您的表单提交了所有配置文件数据到profile[]哈希中,且您的模型看起来像这样:

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
  store_accessor :profile
end

您可以简单地做如下操作:
user.profile = params[:profile]
user.profile.save

无论在控制器中还是其他地方,都应该可以使用。


太棒了!有什么需要注意的缺点或陷阱吗? - cman77
1
@cman77 Rails正在为您执行许多序列化/反序列化操作,而您可能并不知道。与Rails通常一样,当它工作时看起来像魔法,但可能会引起一些问题。请注意非传统数据结构。但是,可以安全地序列化为JSON的所有内容都应该可以正常工作。 - lsdr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接