0

Я пытаюсь создать форму, используя form_for, которая добавит Employees. Для сотрудника я хочу динамически назначать несколько специализаций, таких как C#, asp и т. Д. Я использую следующий код в видеRails 4 Multipleselect

<%= f.select :specilization, Specialization.all.collect{|p| [p.name, p.id]}, {}, :multiple => true %> 

Я также сделал HABTM между сотрудниками и специализации, как

Employee.rb

class Employee < ActiveRecord::Base 
has_and_belongs_to_many :specializations 
end 

Specialization.rb

class Specialization < ActiveRecord::Base 
has_and_belongs_to_many :employees 
end 

с этими результатами, im не удалось сохранить выбранные значения в db (MySQl). Был бы признателен, если бы кто-нибудь мог решить мою проблему или посоветовать мне, как это сделать правильно?

Заранее спасибо.

ответ

0

Обычно я решаю это с помощью has_many :through, а затем в моей форме выбирается field_for на модели объединения. Как это:

class Employee < ActiveRecord::Base 
    has_many :employees_specializations 
    has_many :specializations, through: :employees_specializations 
    # we will be creating these join models on the employee form 
    accepts_nested_attributes_for :employees_specializations 
end 

class Specialization < ActiveRecord::Base 
    has_many :employees_specializations 
    has_many :employees, through: :employees_specializations 
end 

class EmployeesSpecialization < ActiveRecord::Base 
    belongs_to :employee 
    belongs_to :specializations 
end 

Теперь важно отметить, что с этим упрощенным подходом я предполагаю, что Специализации уже существует в базе данных, и мы просто выбрав их и присоединение их к сотруднику мы создания/редактирования:

# in your controller make sure to build at least 1 new instance, the fields_for needs this 
@employee.employees_specializations.build 

# remember to add to your strong parameters the new join attributes 
params.require(:employee).permit(
    # ... other attributes ... 
    employees_specializations_attributes: [:id, :specialization_id] 
) 

Вы должны объявить :id, :specialization_id в качестве вспомогательных полей, так как employees_specializations_attributes будет вложенной хэш с этими ключами внутри.

# now in your form use fields_for 
<%= f.fields_for :employees_specializations do |ef| %> 
    <%= ef.select :specialization_id, Specialization.all.map{|p| [p.name, p.id]}, {}, multiple: true %> 
<% end %> 

Это f.fields_for :employees_specializations создаст поля формы с именем employee[employees_specializations_attributes][][specialization_id]. Что в основном говорит о том, что мы создаем вложенную ассоциацию employees_specializations и устанавливаем specialization_id вложенной ассоциации (помните employee_specialization belongs_to :specialization) выбранной специализации. Обратите внимание на [] в середине имени поля, это означает его массив вложенных employees_specializations.

Опубликовать и запретить любые ошибки проверки, чтобы вы могли создавать/редактировать сотрудника и устанавливать его специализации, выбирая из списка существующих специализаций и создавая модель соединения между ними.

Дальнейшее чтение:

+0

Спасибо. Я последовал твоему шагу. Но я получаю ** неявное преобразование символа в integer ** ошибка в контроллере 'def employee_params params.require (: employee) .permit (: name,: specialization,: employees_specialization [: id,: specialization_id]) end' – Abhishek

+0

У вас есть синтаксическая ошибка. Двоеточие (:) находится на неправильной стороне 'employees_specialization'.А также, это не 'employee_specialization', это' employees_specializations_attributes'. Сделайте это: 'employees_specializations_attributes: [: id,: specialization_id]' – DiegoSalazar

+0

все еще не повезло. неспособный сохранить его, имеет массив. может сохранить то же самое, если я не использую опцию «multiple» в поле select в форме. – Abhishek