Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在数组中合并散列_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 在数组中合并散列

Ruby on rails 在数组中合并散列,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我不熟悉Ruby和Rails,我陷入了需要创建哈希数组的困境。请参阅以下代码: def self.v_and_c items result = [] items.try(:each) do |item| result << item if item.is_parent_variation check_ancestor item result << { :item_variation => @variations } result

我不熟悉Ruby和Rails,我陷入了需要创建哈希数组的困境。请参阅以下代码:

def self.v_and_c items
 result = []
 items.try(:each) do |item|
  result << item
  if item.is_parent_variation
    check_ancestor item
    result << { :item_variation => @variations }
    result << { :options => @options }
   elsif item.is_parent_customization
    check_ancestor item
    result << { :customizations => @customizations }
    result << { :ingredients => @ingredients }
   end
 end
 result
end
但我想这样做

{"items":[{"id":1,"name":"Cake","item_variation":null, "options":null} ]}

它应该像这样简单,使用.merge方法

def self.v_and_c items
 result = []
 items.try(:each) do |item|
  result << item
  if item.is_parent_variation
    check_ancestor item
    result = result.merge { :item_variation => @variations }
    result = result.merge { :options => @options }
   elsif item.is_parent_customization
    check_ancestor item
    result = result.merge { :customizations => @customizations }
    result = result.merge { :ingredients => @ingredients }
   end
 end
 result
end
def self.v_和_c项目
结果=[]
项目。尝试(:每个)做|项|
结果@variations}
result=result.merge{:options=>@options}
elsif item.is_parent_定制
检查项目
result=result.merge{:customizations=>@customizations}
result=result.merge{:contracents=>@contracents}
结束
结束
结果
结束

您可以尝试以下方法:

def self.v_and_c items
 result = []
 items.try(:each) do |item|
  item_hash = {}.merge(item)
  if item.is_parent_variation
    check_ancestor item
    item_hash.merge!({ item_variation: @variations }).merge!({ options: @options})
  elsif item.is_parent_customization
    check_ancestor item
    item_hash.merge!({ customizations: @customizations }).merge!({ ingredients: @ingredients})
  end
   result.push(item_hash)
 end
 result
end
说明: 对于循环的每次迭代,创建一个item_散列并合并其中所有必需的散列,然后将结果散列推送到结果数组中

很少有指针:

  • 注意新的Ruby哈希语法
  • 如果在If和else中都需要检查祖先,为什么不在外部执行呢
def self.v_和c项目
[]点击do |结果|
项目。尝试(:每个)做|项|
结果\u哈希=item.dup
如果item.is\u父项\u变量
检查项目
结果\u hash.merge!({item_variation:@variations,options:@options})
elsif item.is_parent_定制
检查项目
结果\u hash.merge!({customizations:@customizations,Components:@Components})
结束

结果感谢您的快速回复,实际上有时检查_祖先函数没有按照条件调用,因此我调用了两次。item_hash={}.merge(item)-->这是一个创建错误,因此我将其更改为item_hash={}.merge(item:item)然后它运行,否则抛出错误,并没有将项隐式转换为散列。我假设项是散列。我的错。
def self.v_and_c items
 result = []
 items.try(:each) do |item|
  item_hash = {}.merge(item)
  if item.is_parent_variation
    check_ancestor item
    item_hash.merge!({ item_variation: @variations }).merge!({ options: @options})
  elsif item.is_parent_customization
    check_ancestor item
    item_hash.merge!({ customizations: @customizations }).merge!({ ingredients: @ingredients})
  end
   result.push(item_hash)
 end
 result
end
def self.v_and_c items
  [].tap do |result|
  items.try(:each) do |item|
    result_hash = item.dup
    if item.is_parent_variation
      check_ancestor item
      result_hash.merge!({ item_variation: @variations, options: @options })
    elsif item.is_parent_customization
      check_ancestor item
      result_hash.merge!({ customizations: @customizations, ingredients: @ingredients })
    end
    result << result_hash
  end
end