У меня есть три модели, которые имеют полиморфные отношения между ними:
Категория, сектор и курс. Курс может принадлежать либо к категории, либо к сектору, но не к обоим.
В модели курса я настроил ее следующим образом:
belongs_to :parent, :polymorphic => true
accepts_nested_attributes_for :parent
Для модели категории и сектора определено следующее соотношение:
has_many :courses, :as => :parent
Теперь в режиме просмотра курса я хочу установить родителя для курса, который я редактирую, через поле выбора.
У меня есть следующая строка в _form.html.erb:
<%= f.collection_select( :parent_id, @parent_options, :id, :name, {}, { :multiple => false } ) %>
Это возвращает правильный parent_id в хеш в массиве. Когда я смотрю на запись в базе данных, она всегда хранит 1 в качестве parent_id в таблице курсов (количество элементов в массиве?) И вообще не хранит соответствующее имя (что неудивительно, поскольку оно не передается через параметры).
Я понимаю, что это неправильно, но не могу понять, что мне делать.
Переменная экземпляра @parent_options загружается со всеми возможными категориями и секторами в контроллере следующим образом:
@parent_options = Admin::Sector.where(:visible => true) + Admin::Category.where(:visible => true)
Я нашел много информации о работе с полиморфными отношениями в Railscasts и на этом сайте, но все предполагают, что вы хотите добавить комментарии (курсы в моем примере) из статьи (категории или сектора) вместо других наоборот.
Спасибо за помощь!
В HTML присутствует следующее:
<select id="admin_course_parent_id" name="admin_course[parent_id][]"><option value="2">Verzekeraars</option>
<option value="2">Verkooptraining</option>
<option value="3">Specifieke Branches</option></select><select id="admin_course_parent_id" name="admin_course[parent_id][]"><option value="2">Verzekeraars</option>
<option value="2">Verkooptraining</option>
<option value="3">Specifieke Branches</option></select>
Когда я нажимаю кнопку обновления / сохранения, это значение параметров:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"my token", "admin_course"=>{"name"=>"Afsluittechnieken", "position"=>"1", "permalink"=>"afsluiten", "visible"=>"1", "description"=>"Hier leer je afsluittechnieken", "parent_id"=>["3"]}, "commit"=>"Update Course", "id"=>"1"}
"parent_id" => ["3"] указал правильный идентификатор выбранного родителя, но он не сохраняет значение в базе данных.
Спасибо, я прошел долгий путь. Больше не отправляется массив как parent_id. Мне также удалось установить parent_type из скрытого поля после действия onchange. Однако осталась одна проблема: как заполнить значение динамически на основе выбранного значения в поле выбора коллекции? Сейчас я использую следующее утверждение:
<%= f.collection_select( :parent_id, @parent_options, :id, :name, {}, { :onchange => "this.form.admin_course_parent_type.value = 'WHAT GOES HERE'"}) %>
Хотите знать, что происходит здесь? Я должен как-то зачитать класс выбранного значения. Пробовал что-то вроде # {': parent_id.class'}, но в результате он дает Symbol (не слишком удивительно).
В настоящее время модель принимает все виды входных данных в качестве parent_type, действительно надеясь, что из-за этого у меня не будет проблем. И мне интересно, будет ли в окне выбора выбрано правильное значение в следующий раз, когда я загружу страницу при редактировании, но мы увидим это позже.