作为散列参数给出的嵌套属性数组

Array of nested attributes given as a hash parameter

我得到一个 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 文件并解析它,使用产品参数 (product_hash) 创建一个散列。同时,一个产品可以有一个或多个由标签 image_urls 给出的附件。我在每个产品的标签之后进行解析,并使用产品所具有的图像的 url 创建一个数组。我创建产品并为每张图片创建一个附件。

但是我想在嵌套属性的帮助下创建附件,所以我在我的产品模型中添加了这个:

accepts_nested_attributes_for :attachments

这是我在产品控制器中允许的参数(以及其他属性):

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>

我的问题是如何发送嵌套属性数组以及要创建的主要对象?

您可以构建产品附件然后保存产品

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