我得到一个我必须解析的xml文件。从中我获取2个模型的数据。产品和附件。附件是产品的图像。 这就是代码的用法,我将通过解释来遵循它:
def add_to_db_from_file
transaction do
save!
xml = Nokogiri::XML(File.open(self.file.current_path))
xml.xpath("//item").each do |item|
product_hash = %w[campaign_name widget_name title description short_message price category
subcategory url product_id aff_code].each_with_object({}) do |n, h|
h[n.intern] = n != 'price' ? item.at(n).text : item.at(n).text.to_i
end
attachments_array = item.css('image_urls').map do |url|
url.text.split(' ')
end.flatten
@product = self.products.create!(product_hash)
attachments_array.each do |p|
@product.attachments.create!(remote_picture_url: p)
end
end
end
end
我打开一个xml文件并解析它,创建一个带有proucts params(product_hash)的哈希。同时,产品可以包含标签image_urls给出的一个或多个附件。我在每个产品的标签之后解析,并使用产品所具有的图像的网址创建一个数组。我创建了产品,并为每个图像创建了一个附件。
但是我想借助嵌套属性创建附件,所以我在产品模型中添加了这个:
accepts_nested_attributes_for :attachments
这是我在产品控制器中的permited params(以及其他属性):
params.require(:product).permit( attachments_attributes: [:id, :product_id, :picture, :remote_picture_url])
我尝试使用attachments_array制作哈希并将其与product_hash合并,因此它应该使用嵌套属性与产品一起创建附件:
attachments_array = item.css('image_urls').map do |url|
{remote_picture_url: url.text.split(' ') }
end.flatten
@product = self.products.create!(product_hash.merge!({attachments_attributes: attachments_array}))
然而,这显然不是我得到的解决方案:
NoMethodError: undefined method `gsub' for #<Array:0x007f3b6d832138>
我的问题是如何发送嵌套属性数组以及要创建的主要对象?
答案 0 :(得分:1)
您可以构建产品附件,然后保存产品
product = Product.new(product_hash)
attachements_array.each do |url|
product.attachements.build(remote_picture_url: url)
end
product.save
如果要将所有项目都包含在哈希中,那么product
哈希将是
product_hash = {product_attr1: product_attr1_val, product_attr2: product_attr2_val, attachementes_attributes: [{attach_attr1: attach_attr1_val}, {attach_attr1: attach_attr1_val}] }
Product.create(product_hash)
更多相关内容:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html