Сериализованный хеш нельзя сохранить в базе данных postgres

В моем приложении есть таблица с именем 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

КонтактыКонтроллер:

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"}

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

изменить :areas_of_interest на areas_of_interest: {}

fanta 14.03.2019 22:53

Где? В модели?

andrzej541 14.03.2019 22:54

в params.require(:contact).permit(...

fanta 14.03.2019 23:00

Если у вас есть postgres - используйте тип данных jsonb или hstore.

Igor Kasyanchuk 14.03.2019 23:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

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

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

Другие вопросы по теме