Как указать выбранный элемент в сгруппированном выборе

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Как мне указать выбранный параметр, если два из этих параметров имеют одинаковый идентификатор? У меня есть эта форма ввода

 <%= f.input :receiver_id,
                  label:        "Client",
                  collection:   receivers_keys_and_values,
                  as:           :grouped_select,
                  group_method: :last %>
  

и этот метод для создания параметров выбора

 def receivers_keys_and_values
    [
      ["Client",  Client.all.map { |c| [c.name, c.id] }],
      ["Program", Program.all.map { |p| [p.name, p.id] }]
    ]
  end
  

Проблема, с которой я сталкиваюсь, заключается в том, что идентификатор клиента может совпадать с идентификатором программы. Поэтому, когда два идентификатора совпадают, выбранный всегда является программным.
Как я мог бы указать что-то вроде?

 selected: ["Client"][id]
or 
selected: ["Program"][id]
  

Ответ №1:

Таким образом, идентификаторы выбранных элементов будут разными для программ и клиентов:

 def receivers_keys_and_values
  [
    ["Client",  Client.all.map { |c| [c.name, "client_#{c.id}"] }],
    ["Program", Program.all.map { |p| [p.name, "program_#{p.id}"] }]
  ]
end
  

Вам также необходимо будет обновить код обработки формы, чтобы иметь возможность анализировать ввод, например «program_123».

Вы также можете пофантазировать и немного переработать код:

 def receivers_keys_and_values
  [Client, Program].map do |type|
    type.all.map { |entity| [entity.name, dom_id(entity) }
  end
end
  

но я не уверен, что это понятнее (хотя должно привести к тому же результату). Решать вам.