Как сохранить выбранные значения из одного столбца таблицы в другой столбец таблицы - PullRequest
0 голосов
/ 15 февраля 2020

Я новичок в Rails и пытаюсь учиться. В моей простой форме я создал выпадающий список с созданными данными из таблицы, называемой профессиями. Эта часть работает нормально, и я могу выбрать несколько значений. Я использую базу данных mysql.

Когда я нажимаю кнопку отправки, мне нужно сохранить выбранные значения в столбце my_professions в другой таблице с именем users. Я не могу понять, как это сделать. Я получаю эту ошибку

param is missing or the value is empty: user

Моя форма

<%= simple_form_for @user, url: wizard_path, method: :put do |f| %>
<%= collection_select(:f, :professions_id, Profession.where.not(name: nil), :id, :name, {:multiple => true}, {:class=>'js-example-basic-multiple', :id=>'jsmultipleddd'}) %>
<%= f.submit "Save", :class => 'btn blue'  %> 
<% end %>

Я пытался добавить это к модель пользователя

user.rb

class User < ApplicationRecord

has_many :professions
accepts_nested_attributes_for :professions

serialize :my_professions, Array
end

И это для модели профессии

профессией. rb

class Profession < ApplicationRecord
belongs_to :user
end


мои параметры выглядят так

registration_steps_controller.rb

def user_params

  params.require(:user).permit(:gender,:practitioner_website, :public_health_insurance, clinic_images: [], professions: [])

end

application_controller.rb

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
  devise_parameter_sanitizer.permit(:account_update, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []]) 
end

1 Ответ

0 голосов
/ 15 февраля 2020

Начните с избавления от accepts_nested_attributes_for :professions. Вам не нужны вложенные атрибуты для этого.

Тогда избавьтесь от serialize :my_professions, Array. Serialize - это устаревший хак для хранения сложных данных в строковых столбцах. Вам это не нужно или не нужно (когда-либо), поскольку ассоциации должны храниться в таблицах объединения в ActiveRecord, а не в столбцах массива. Вот как AR был разработан для работы, и именно так реляционные базы данных были созданы для работы.

Вместо этого вам нужна модель соединения. Что вы можете сгенерировать с помощью:

rails g model user_profession user:belongs_to profession:belongs_to

Запустите миграцию. Затем вы настраиваете ассоциации между пользователями и профессиями:

class User < ApplicationRecord
  # ...
  has_many :user_professions
  has_many :professions, through: :user_professions
end

class Profession < ApplicationRecord
  # ...
  has_many :user_professions
  has_many :users, through: :user_professions
end

Теперь это позволяет нам связывать пользователей с профессиями, передавая profession_ids.

в обычной форме Rails вы должны создать ввод с помощью:

<%= f.collection_select :profession_ids, Profession.all, :id, :name, multiple: true ... %>

В SimpleForm используйте ассоциацию помощник:

<%= f.association :professions, ... %>

Затем добавьте в белый список правильный параметр:

def user_params
  # don't jam this into one super long unreadable line
  params.require(:user)
        .permit(
          :gender, :practitioner_website, :public_health_insurance, 
          clinic_images: [], profession_ids: []
        )
end
...