作为散列参数给出的嵌套属性数组
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
我得到一个 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