我想关注选择标记
<select>
<option value=10> 10% </option>
<option value=20> 20% </option>
<option value=30> 30% </option>
</select>
使用
((0..10).to_a.collect {|r| ["#{r*10} %", r*10] })
将提供类似
的结构[["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
我想知道这个结构是否可以转换为类似的东西
[#<ratio id: 10, name: "10%">, #<id: 20, name:"20%">]
如何将第一个结构转换为第二个结构
所以我可以使用
options_from_collection_for_select(@arr,"id","name")
填充select_tag 或
还有更好的方法吗?
请评论。
答案 0 :(得分:3)
您可以尝试使用OpenStruct。
OpenStruct是一种类似于Hash的数据结构,允许使用 任意属性的定义及其伴随值。 这是通过使用Ruby的元编程来定义方法来实现的 关于班级本身。
require 'ostruct'
(0..10).map { |i| OpenStruct.new(:id => i*10, :name => "#{i*10}%") }
# => [#<OpenStruct id=0, name="0%">, #<OpenStruct id=10, name="10%">, ...
但是如果你需要一个真正的类,而不是像OpenStruct这样的匿名类,那么只需在collect / map方法中创建这个类实例:
class Ratio
attr_reader :id, :name
def initialize(id, name)
@id = id; @name = name
end
end
(0..10).map { |i| ratio = i*10; Ratio.new(ratio, "#{ratio}%") }
# => [#<Ratio: @id=0, @name="0%">, #<Ratio: @id=10, @name="10%">, ...
也许我误解了你一点,你想创建这个结构不是来自范围,而是来自数组[["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
然后代码是相似的:
require 'ostruct'
arr = [["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
p arr.map { |name, id| OpenStruct.new(:id => id, :name => name) }
# => [#<OpenStruct id=0, name="0 %">, #<OpenStruct id=10, name="10 %">, #<OpenStruct id=20, name="20 %">, #<OpenStruct id=30, name="30 %">]
<强>更新强>
我找到了一个使用OpenStruct的案例(看起来只有 Ruby 1.8.7 的情况):OpenStruct#id
将返回object_id
代替id
字段值:
ruby-1.8.7-p352 > o = OpenStruct.new :id => 10
=> #<OpenStruct id=10>
ruby-1.8.7-p352 > o.id
(irb):4: warning: Object#id will be deprecated; use Object#object_id
=> 70021843187380
有两种解决方法:
# 1. redefine OpenStruct#id method:
OpenStruct.__send__(:define_method, :id) { @table[:id] }
# 2. dont use 'id' as a value and use any other value:
require 'ostruct'
(0..10).map { |i| OpenStruct.new(:value => i*10, :name => "#{i*10}%") } # 'value' instead of 'id'
...
options_from_collection_for_select(@arr, 'value', 'name')
我建议你使用第二种方法。
答案 1 :(得分:1)
array = [["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
@arr = array.collect { |sub_array| Ratio.new(:id=>sub_array.last, :name=>sub_array.first) }