Rails:如何使用字符串中的属性初始化对象?

时间:2013-07-07 05:02:13

标签: ruby-on-rails initialization hashmap

可能一直在研究这个太长,邋design的设计,或两者兼而有之。我的问题是我有一个我希望初始化的模型。该对象具有52个属性,但我只是根据我刚刚扫描的对象设置了~25。当我扫描一个对象时,我得到了列并将它们与我创建的hash_map匹配。

示例哈希地图

这只是将扫描的文本与其各自的属性名称匹配。

hash_map = {"Pizza."=>"pizza_pie","PastaBowl"=>"pasta_bowl","tacos"=>"hard_shell_taco","IceCream"=>"ice_cream","PopTarts"=>"pop_tart"}

我想做什么

menu = RestaurantMenu.new(pizza_pie => var1, pasta_bowl => var2, ...)

我唯一的问题是在我的代码中,我有这个......

t.rows.each do |r|
  for i in 0..r.length-1
     #hash_map[t.combined_columns[i]] => r.[i]
     puts "#{hash_map["#{t.combined_columns[i]}"]} => #{r[i]}"
  end
end

puts行显示我想要的内容,但不确定如何在我的应用中正确显示。

2 个答案:

答案 0 :(得分:0)

以下是解决此问题的几种方法:

hash_map = {"Pizza."=>"pizza_pie","PastaBowl"=>"pasta_bowl","tacos"=>"hard_shell_taco","IceCream"=>"ice_cream","PopTarts"=>"pop_tart"}

attributes.each do |attribute, element|
  message.send((attribute + '=').to_sym, hash_map[element])
end

或者像这样:

class Example
  attr_reader :Pizza, :PastaBowl #...

  def initialize args
    args.each do |k, v|
      instance_variable_set("@#{k}", v) unless v.nil?
    end
  end
end

了解更多详情click here

答案 1 :(得分:0)

我最终做了以下方法:

attributes = Hash[]
attributes["restaurant"] = tmp_basic_info.name
attributes["menu_item"] = tmp_basic_info.item_name

t.rows.each do |r|
  for i in 0..r.length-1
     attributes["other"] = t.other_information
     attributes[hash_map[t.combined_columns[i]] = r[i]
  end
  row = ImportMenuItem.new(attributes)
  row.save
end