如何使用 rails 表单和 jsonb postgres
How to work with rails form and jsonb postgres
我正在考虑在 Rails4.2 和 Postgres4.1 中使用新的 jsonb 功能。
我正在考虑创建一个代表用户配置文件(即技能集等)的模型并将整个模型存储在单个 jsonb 数据集中。
所以 table 会:
id int
profile jsonb
timestamps
我想我基本上可以将所有配置文件数据存储在 jsonb 结构中,如下所示(这只是一个 example/concept):
{
"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 表单来 write/read 这个结构?我了解如何对 table 的传统关系集执行此操作,但不确定如何处理它何时可以全部进入如下所示的灵活结构?
在 _form.html.erb 和控制器 new/create/edit 操作中会发生什么?
使用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
在您的控制器(或其他任何地方)中它应该可以工作。
我不知道以前的版本,但 在 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)
我正在考虑在 Rails4.2 和 Postgres4.1 中使用新的 jsonb 功能。
我正在考虑创建一个代表用户配置文件(即技能集等)的模型并将整个模型存储在单个 jsonb 数据集中。
所以 table 会:
id int
profile jsonb
timestamps
我想我基本上可以将所有配置文件数据存储在 jsonb 结构中,如下所示(这只是一个 example/concept):
{
"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 表单来 write/read 这个结构?我了解如何对 table 的传统关系集执行此操作,但不确定如何处理它何时可以全部进入如下所示的灵活结构?
在 _form.html.erb 和控制器 new/create/edit 操作中会发生什么?
使用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
在您的控制器(或其他任何地方)中它应该可以工作。
我不知道以前的版本,但 在 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)