作为哈希参数

时间:2015-09-18 07:01:05

标签: ruby-on-rails nested-attributes

我得到一个我必须解析的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>

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

1 个答案:

答案 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