13

我正在考虑在 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 操作会发生什么?

4

2 回答 2

8

使用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

在您的控制器(或其他任何地方)中,它应该可以工作。

于 2015-05-04T20:11:36.023 回答
7

我不知道以前的版本,但在文档中的 Rails 6中: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)字段一样对待它们。

不要忘记在您的强参数中允许 :property1 和 property2 等,即:

params.require(:my_model).permit(:title, [...], :property1, :property2)
于 2020-09-04T15:56:11.863 回答