5

次のRuby文字列を配列に変換する最良の方法は何ですか(私は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\"]"] 

これを解決するための明白な方法があるに違いないと私は確信しています。

わかりやすくするために、これはフォームのテキストエリアフィールドで編集できるため、できるだけ安全にする必要があります。

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、結果の戻り配列の出力を返すように見えます。そのように出力することはあまり役に立ちません。プレーン配列を返すように変更する機能はありますか?

私がやらないのは、すでにハッキーなコードのハッキーさを増すだけの使用ですeval

于 2012-05-10T01:10:42.143 に答える
1

Mark Thomasが言ったように、文字列と配列をそれぞれ返す2つの別々のメソッドが本当に必要でない限り、componentsメソッドを変更します。本当に配列を返したいだけだと思います。議論のために、あなたの成分メソッドが現在、という名前の変数を返しているとしましょう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 に答える