使用Ruby on Rails中的options_for_select检索数据库记录和另一个选项值

时间:2019-05-13 02:53:14

标签: ruby ruby-on-rails-5

我正在研究在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)

这会生成选项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 个答案:

答案 0 :(得分:1)

如果我明白了这一点,例如以@position = Subject.pluck(:position)从Subject抓取,您最终会得到:

@position = [1,2,3]

然后,您需要附加一个元素,该元素的值是最后一个加1的元素。

对于Ruby 2.6,您可以尝试使用Object#then

[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

答案 1 :(得分:1)

我认为上述iGian解决方案很好。但是他从新版本的Ruby中引入了一些新方法。如果您还需要一个可以与较低版本(以及新版本)一起使用的解决方案,请尝试以下操作:

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

# or

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

希望这会有所帮助

答案 2 :(得分:0)

更新:这是正确的答案,或做我想要的正确方法。

实际上我们可以简单地做到这一点的代码只是复杂而已... 在表单视图中:

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

然后在控制器中:

@subject_count = Subject.count + 1

这将生成数据库计数+ 1,而不会检索任何重复的(数字)位置… 就这样!多么神奇,它应该多么简单。