5

将以下 Ruby 字符串转换为数组的最佳方法是什么(我使用的是 ruby​​ 1.9.2/Rails 3.0.11)

导轨控制台:

>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 字段中进行编辑,因此应尽可能安全。

4

6 回答 6

9

你所拥有的看起来像 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以便该方法返回更有意义的内容。如果您几乎总是对方法的返回值执行相同的操作,则该方法是错误的。

于 2012-05-10T01:50:25.727 回答
5
class Item
  def ingredients_a
    ingredients.gsub(/(\[\"|\"\])/, '').split('", "')
  end
end
  1. 去掉多余的字符
  2. 使用分隔模式拆分为数组元素
于 2012-05-10T01:46:31.563 回答
1

看起来该ingredients方法返回了.inspect结果返回数组的输出。这样输出不是很有用。你有能力改变它来返回一个普通的数组吗?

不会做的是 use eval,这只会增加已经 hacky 代码的 hackiness。

于 2012-05-10T01:10:42.143 回答
1

就像 Mark Thomas 所说,修改你的成分方法,除非你真的想要两个单独的方法,分别返回一个字符串和一个数组。我假设您真的只想返回一个数组。为了论证,假设您的成分方法当前返回一个名为 的变量ingredients_string。像这样修改你的方法:

def ingredients
  ...
  ingredients_array = ingredients_string.split('"')
  ingredients_array.delete_if { |element| %(", "[", "]").include? element }
  ingredients_array
end
于 2012-05-10T01:50:19.550 回答
0

不确定这是否起作用,但是如果您想使用数组作为属性会发生什么,您可能需要考虑序列化..

class Item << ActiveWhatever
  serialize :ingredients, Array

  ...
end

更多关于序列化的信息在这里http://api.rubyonrails.org/classes/ActiveRecord/Base.html

于 2012-05-10T01:11:51.317 回答
0

如果您的字符串数组是标准 JSON 格式,只需使用JSON.parse()

于 2016-01-22T10:11:01.653 回答