将以下Ruby String转换为数组的最佳方法是什么(我使用ruby 1.9.2 / Rails 3.0.11)
Rails控制台:
>Item.first.ingredients
=> "[\"Bread, whole wheat, 100%, slice\", \"Egg Substitute\", \"new, Eggs, scrambled\"]"
>Item.first.ingredients.class.name
=> "String"
>Item.first.ingredients.length
77
所需的输出:
>Item.first.ingredients_a
["Bread, whole wheat, 100%, slice", "Egg Substitute", "new, Eggs, scrambled"]
>Item.first.ingredients_a.class.name
=> "Array
>Item.first.ingredients_a.length
=> 3
如果我这样做,例如:
>Array(Choice.first.ingredients)
我明白了:
=> ["[\"Bread, whole wheat, 100%, slice\", \"Egg Substitute\", \"new, Eggs, scrambled\", \"Oats, rolled, old fashioned\", \"Syrup, pancake\", \"Water, tap\", \"Oil, olive blend\", \"Spice, cinnamon, ground\", \"Seeds, sunflower, kernels, dried\", \"Flavor, vanilla extract\", \"Honey, strained/extracted\", \"Raisins, seedless\", \"Cranberries, dried, swtnd\", \"Spice, ginger, ground\", \"Flour, whole wheat\"]"]
我确信必须有一些明显的方法来解决这个问题。
为清楚起见,这可以在表单的textarea字段中编辑,因此应尽可能安全。
答案 0 :(得分:8)
你看起来像JSON,所以你可以这样做:
JSON.parse "[\"Bread, whole wheat, 100%, slice\", \"Egg Substitute\", \"new, Eggs, scrambled\"]"
#=> ["Bread, whole wheat, 100%, slice", "Egg Substitute", "new, Eggs, scrambled"]
这避免了使用eval
的许多恐怖。
虽然您应该首先考虑为什么要存储这样的数据,并考虑更改它,这样您就不必这样做了。此外,您可能应该将其解析为ingredients
中的数组,以便该方法返回更有意义的内容。如果您几乎总是对方法的返回值执行相同的操作,则该方法是错误的。
答案 1 :(得分:5)
class Item
def ingredients_a
ingredients.gsub(/(\[\"|\"\])/, '').split('", "')
end
end
答案 2 :(得分:1)
看起来ingredients
方法返回结果返回数组的.inspect
输出。这种输出方式不是很有用。你有能力改变它以返回普通阵列吗?
我不所做的是使用eval
,这只会增加已经黑客代码的黑客程度。
答案 3 :(得分:1)
像Mark Thomas所说,修改你的成分方法,除非你真的想要两个分别返回字符串和数组的单独方法。我假设你真的只想要返回一个数组。为了论证,让我们说你的成分方法当前返回一个名为ingredients_string
的变量。像这样修改你的方法:
def ingredients
...
ingredients_array = ingredients_string.split('"')
ingredients_array.delete_if { |element| %(", "[", "]").include? element }
ingredients_array
end
答案 4 :(得分:0)
不确定是否会发挥作用,但如果您想将数组用作属性会发生什么,您可能需要考虑序列化..
class Item << ActiveWhatever
serialize :ingredients, Array
...
end
有关序列化http://api.rubyonrails.org/classes/ActiveRecord/Base.html
的更多信息答案 5 :(得分:0)
如果您的字符串数组是标准JSON格式,请使用JSON.parse()