Сериализованный хэш не может быть сохранен в базе данных postgres - PullRequest
0 голосов
/ 15 марта 2019

В моем приложении есть таблица с именем contacts с полем areas_of_interest.В этом поле должны храниться хэши, отправленные пользователем через форму.Однако моя база данных отклоняет эти хэши и оставляет это поле пустым каждый раз, когда я хочу сохранить его:

Схема:

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

ContactsController:

def update
  respond_to do |format|
    if @contact.update(contact_params)
      format.html do
        redirect_to root_path, notice: 'Contact has been updated'
      end
    else
      format.html do
        render :edit, notice: 'Error'
      end
    end
  end
end

private

def contact_params
  params.require(:contact).permit(
    ...
    :areas_of_interest,
    ...
  )
end

И хеш, отправленный клиентом, выглядит следующим образом:

{"first"=>"1", "second"=>"0", "third"=>"0", "fourth"=>"0", "fifth"=>"1"}

Что я могу сделать здесь неправильно и как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

areas_of_interest похоже, что отфильтровывается по strong_params.Я думаю, что вам нужно что-то вроде этого, чтобы указать, какие ключи должны быть разрешены:

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

Я также настоятельно рекомендую использовать тип jsonb, как упомянуто @ Schwern.

1 голос
/ 15 марта 2019

Ваш формат выглядит как дамп Ruby Hash.serialize выполняется с использованием YAML .Это выглядело бы так:

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

Но есть и лучший способ.Поскольку вы используете Postgres, вы можете воспользоваться Postgres JSONB и отправить данные в формате JSON.Сериализация будет обработана для вас, у вас есть все возможности Средства поиска JSON Postgres , а 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, как и любое другое поле, но для этого могут потребоваться хэши и массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...