如何在rake任务中更新多态图像?

时间:2017-04-17 21:33:29

标签: ruby ruby-on-rails-5

我有厕所和照片模型,照片有多态关联。 我有一个rake任务,从csv文件收集信息。我想更新图片,但由于它不是厕所桌子的一部分,我很难搞清楚。我用回形针来处理我的图像。

我的任务看起来像这样

 namespace :import do
  desc "Importing toilets from csv"
  task toilets: :environment do
   filename = File.join Rails.root, "toilets.csv"
   counter = 0
   CSV.foreach(filename,  headers: true) do |row|
     toilet = Toilet.create(
     name:        row['name'], 
     latitude:     row['latitude'], 
     longitude:  row['longitude'],
     address:   row['address'],
     image:      row['image']
     )
   puts "#{toilet} - #{toilet.errors.full_messages.join(",")}" if toilet.errors.any?
   counter += 1 if toilet.persisted?
  end
  puts "Imported #{counter} toilets"
 end
end

厕所模型

has_many :photos, :as => :imageable
accepts_nested_attributes_for :photos

照片模特

 belongs_to :toilet
 belongs_to :imageable, :polymorphic => true

 has_attached_file :image, styles: { medium: "300x300>", thumb: "100x100>" }
 validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/

1 个答案:

答案 0 :(得分:0)

我想出了如何使用下面的代码更新图像。这有效,但我觉得可能有一个更清洁的解决方案。

 toilet = Toilet.create(
  name:        row['name'], 
  latitude:     row['latitude'], 
  longitude:  row['longitude'],
  address:   row['address']
 )


 photo = Photo.create(
  image: row["image"],
  imageable_type: "Toilet",
  imageable_id: toilet.id
 )