Получить запись базы данных + другое значение параметра, используя options_for_select в Ruby on Rails - PullRequest
0 голосов
/ 13 мая 2019

Я изучаю создание формы на Ruby on Rails, но не могу понять, как вернуть значения, которые я хотел, используя options_for_select.

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

, например, пользователь создает новую тему в поле «Форма».Возможные варианты: 1,2,3 (числа, полученные в базе данных) и 4 (новый номер, которого еще нет в базе данных)

Я успешно попытался извлечь значения базы данных и «другое» значение отдельно, ноЯ не смог соединить их, чтобы вернуться вместе в одном и том же поле параметров.

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

Вот код ... В представленияхи контроллер

<%= f.select(:position, options_for_select([@position, @positionTwo.position, @position.last, @additional])) %>

@position = Subject.pluck(:position)
@positionTwo = Subject.find(2)
@additional = Subject.pluck(:position).size + 1

генерирует параметры 1,2,3,4, но результаты добавляются вручную

Я успешно попытался получить значения базы данных, используя:

<%= f.select(:position, options_for_select(@position)) %>
@position = Subject.pluck(:position)

thisгенерирует опции 1,2,3

для «другого» значения

<%= f.select(:position, options_for_select(@additional)) %>
@additional = Subject.pluck(:position).size + 1

, генерирует опцию 4

Каким должно быть мое ожидаемое поведение и результат

параметры 1,2,3,4 генерируются динамически

1,2,3 извлекается из базы данных, а 4 - это динамическое число, зависящее от номера последней позиции в базе данных+1 (3 + 1 = 4)

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Я думаю, что решение выше iGian это хорошо.Но он представил несколько новых методов из новых версий Ruby.Если вам нужно решение, которое можно использовать и с более низкими версиями (и с новыми), попробуйте следующее:

Proc.new { |arr| arr << arr.last + 1 }.call(Subject.pluck(:position))

# or

lambda { |arr| arr << arr.last + 1 }.call(Subject.pluck(:position))

Надеюсь, это поможет

1 голос
/ 13 мая 2019

Если я получу точку, выбирая из субъекта как @position = Subject.pluck(:position), вы получите, например,:

@position = [1,2,3]

Затем вам нужно добавить один элемент, значение которого будет увеличено последним на единицу.

Для Ruby 2.6 вы можете попробовать использовать Object # затем :

[1,2,3].then { |ary| ary << ary.last + 1 } #=> [1, 2, 3, 4]

Итак, в вашем случае это должно работать:

@position = Subject.pluck(:position).then { |positions| positions << positions.last + 1 }

Для Ruby 2.5 используйте Object # yield_self .

0 голосов
/ 24 мая 2019

Обновление: это правильный ответ или правильный способ сделать то, что я хотел.

Коды, которые просто сложны, хотя на самом деле мы можем просто сделать это следующим образом ... В виде формы:

<%= f.select :position, 1..@subject_count %>

Затем в контроллере:

@subject_count = Subject.count + 1

Этогенерирует счетчик БД + 1 без извлечения дубликатов (чисел) позиций ... Вот и все!Удивительно, насколько просто это должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...