序列化的哈希不能保存在postgres数据库上

时间:2019-03-14 21:44:01

标签: ruby-on-rails ruby hash

在我的应用中,我有一个名为Get-Item -Path foo.txt且带有Get-Item foo.txt字段的表。此字段应存储用户通过表单发送的哈希。但是,我的数据库拒绝这些哈希,并且每次我要保存时都将此字段留空:

模式:

contacts

联系方式:

areas_of_interest

ContactsController:

create_table "contacts", force: :cascade do |t|
  ...
  t.text "areas_of_interest"
  t.index ["user_id"], name: "index_contacts_on_user_id"
end

从客户端发送的哈希看起来像这样:

class Contact < ApplicationRecord belongs_to :user serialize :areas_of_interest ... end

在这里我可能会做错什么,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的格式似乎是Ruby Hash的转储。 serialize使用YAML完成。看起来像这样。

{ first: "1", second: "0", third: "0", fourth: "0", fifth: "1"}

但是有更好的方法。由于您使用的是Postgres,因此可以利用Postgres JSONB并将数据作为JSON发送。序列化将为您处理,您拥有Postgres's JSON search facilities的全部功能,并且JSON是大多数语言都可以产生的标准格式。

{ "first": "1", "second": "0", "third": "0", "fourth": "0", "fifth": "1"}

create_table "contacts", force: :cascade do |t|
  ...
  t.jsonb :areas_of_interest
  t.index [:areas_of_interest], using: :gin
end

Contact中不需要任何特殊内容。与其他任何字段一样,使用contact.areas_of_interest,但可以使用哈希和数组。

答案 1 :(得分:1)

areas_of_interest似乎已被strong_params过滤掉。我认为您需要的是这样的东西,以指示应允许使用哪些键:

params.require(:contact).permit(
  ...
  areas_of_interest: [:first, :second, :third, :fourth, :fifth],
  ...
)

我也强烈建议使用@Schwern提到的jsonb类型。