Rails 4 — Использование collection_select для получения массива идентификаторов для промежуточной таблицы с вложенными атрибутами

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

У меня есть модель MediaLibrary. У меня есть модель PageTitle, которая содержит имена. У меня есть модель MediaPage, которая содержит поля идентификатора для MediaLibrary и PageTitle. Я хочу заполнить MediaPage, используя вложенные атрибуты. Я хочу создать collection_select для PageTitle со значениями, которые заполняют page_title_id MediaPage.

Вот мои определения модели.

media_library.rb

has_many :media_pages, dependent: :destroy
accepts_nested_attributes_for :media_pages, allow_destroy: true  

media_page.rb

belongs_to :media_library

validates :media_library_id, presence: true  
validates :page_title_id, presence: true 

page_title.rb

has_many :media_pages

Мой исходный код представления, когда я вручную собирал значения, приведен ниже.

<%= fields_for :media_pages do |media_page| %>
  <%= media_page.label :media_page, "Page Titles" %><%= media_page.collection_select(:page_title_id, PageTitle.order("name"), :id, :name, {}, {multiple: true}) %>
<% end %>

Вот мой текущий вид:

<%= f.label :media_pages, "Page Titles" %>
<%= f.fields_for :media_pages do |media_page| %>
  <%= media_page.collection_select(:page_title_id, PageTitle.order("name"), :id, :name, {}, {multiple: true}) %>
<% end %>

Если у меня есть более одной строки MediaPage, в представлении будет отображаться список collection_select для каждой строки. Например, если у меня есть две строки MediaPage, я увижу один список collection_select с выделенным именем PageTitle для первой записи и второй список collection_select с выделенным именем PageTitle для второй записи. Как видите, единственное, что я изменил по сравнению с первым оператором fields_for, а второе — это (1) перемещение метки за пределы fields_for и (2) добавление f.

Я попытался сделать что-то подобное в Rails 3 Rails 3.2.13 - Удалить запись Из вложенных атрибутов. Когда я пытался это сделать в Rails 3, collection_select отображал только один список с несколькими выделенными строками. Поскольку возникла проблема с пустой записью в массиве, я решил продолжить ручной процесс обновления промежуточной таблицы.

Я хочу, чтобы в моем представлении отображался один список collection_select, в котором можно было бы выбрать несколько идентификаторов PageTitle, и заполнить таблицу MediaPage с помощью вложенных атрибутов. Если строки существуют, я хочу, чтобы соответствующие строки PageTitle были выделены.

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

Любая помощь будет оценена по достоинству.


person Pamela Cook - LightBe Corp    schedule 11.11.2013    source источник


Ответы (1)


Проведя дополнительную проверку, я смог найти решение. Я реализовал что-то похожее на то, что я прочитал в Rails has_many :through и collection_select с несколькими.

media_library.rb

has_many :page_titles, through: :media_pages
has_many :media_pages, dependent: :destroy
accepts_nested_attributes_for :media_pages, allow_destroy: true

media_page.rb

belongs_to :media_library  
belongs_to :page_title

page_title.rb

has_many :media_pages, dependent: :destroy

Я заменил fields_for следующим оператором collection_select.

<%= collection_select(:media_library, :page_title_ids, PageTitle.order("name"), :id, :name, {:selected => @media_library.page_title_ids, include_hidden: false}, {:multiple => true}) %>

Теперь у меня есть строки в раскрывающемся списке, выбранные с помощью page_title_ids из MediaPage. Я вручную удаляю и добавляю строки MediaPage из params[:media_library][:page_title_ids].

person Pamela Cook - LightBe Corp    schedule 12.11.2013