Ruby on rails 在数组中合并散列
我不熟悉Ruby和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
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