0

私は大きな問題を抱えています...

Railsアプリを介して約500枚の画像をいくつかの異なるサイズでS3にアップロードしました。今、私はそれらの画像の寸法をデータベースに保存する必要があることに気づきました。これを行うための私のアプローチは、この移行を使用することです。

class AddImageDimensionsToImages < ActiveRecord::Migration
  def change

    # add image columns
    add_column :images, :small_width, :integer
    add_column :images, :small_height, :integer
    add_column :images, :medium_width, :integer
    add_column :images, :medium_height, :integer
    add_column :images, :large_width, :integer
    add_column :images, :large_height, :integer
    add_column :images, :original_width, :integer
    add_column :images, :original_height, :integer

    # loop all images
    Image.all.each do |image|

      # get sizes
      geo_small = Paperclip::Geometry.from_file(image.image.to_file(:small))
      geo_medium = Paperclip::Geometry.from_file(image.image.to_file(:medium))
      geo_large = Paperclip::Geometry.from_file(image.image.to_file(:large))
      geo_original = Paperclip::Geometry.from_file(image.image.to_file(:original))

      # set sizes
      image.small_width = geo_small.width if geo_small
      image.small_height = geo_small.height if geo_small

      image.medium_width = geo_medium.width if geo_medium
      image.medium_height = geo_medium.height if geo_medium

      image.large_width = geo_large.width if geo_large
      image.large_height = geo_large.height if geo_large

      image.original_width = geo_original.width if geo_original
      image.original_height = geo_original.height if geo_original

      # save image
      image.save

    end

  end

end

この移行を実行すると、次のようになります。

...

-- add_column(:images, :small_width, :integer)
   -> 2.0866s
-- add_column(:images, :small_height, :integer)
   -> 0.0092s
-- add_column(:images, :medium_width, :integer)
   -> 0.0073s

...

Command :: identify -format %wx%h '/app/tmp/HayUnFinal_1620120408-4-qpzyym.jpg[0]'
[AWS S3 200 0.106467] get_object(:bucket_name=>"aa",:key=>"original/34/HayUnFinal_16.jpg")

Command :: identify -format %wx%h '/app/tmp/HayUnFinal_1620120408-4-1vqo71y.jpg[0]'
[paperclip] Saving attachments.
[AWS S3 200 0.152898] get_object(:bucket_name=>"aa",:key=>"small/64/Portrait_2.jpg")

Command :: identify -format %wx%h '/app/tmp/Portrait_220120408-4-i1ohlr.jpg[0]'
[AWS S3 200 0.055378] get_object(:bucket_name=>"aa",:key=>"medium/64/Portrait_2.jpg")

Command :: identify -format %wx%h '/app/tmp/Portrait_220120408-4-viizzf.jpg[0]'
[AWS S3 200 0.079235] get_object(:bucket_name=>"aa",:key=>"large/64/Portrait_2.jpg")

Command :: identify -format %wx%h '/app/tmp/Portrait_220120408-4-1d2u00o.jpg[0]'
[AWS S3 200 0.066724] get_object(:bucket_name=>"aa",:key=>"original/64/Portrait_2.jpg")

Command :: identify -format %wx%h '/app/tmp/Portrait_220120408-4-jq9wmg.jpg[0]'
[paperclip] Saving attachments.
[AWS S3 200 0.104891] get_object(:bucket_name=>"aa",:key=>"small/58/Bansah_24.jpg")

Command :: identify -format %wx%h '/app/tmp/Bansah_2420120408-4-an2mpt.jpg[0]'
[AWS S3 200 0.064148] get_object(:bucket_name=>"aa",:key=>"medium/58/Bansah_24.jpg")

Command :: identify -format %wx%h '/app/tmp/Bansah_2420120408-4-tzmnup.jpg[0]'
[AWS S3 200 0.051090] get_object(:bucket_name=>"aa",:key=>"large/58/Bansah_24.jpg")

Command :: identify -format %wx%h '/app/tmp/Bansah_2420120408-4-1pa0rxh.jpg[0]'
[AWS S3 200 0.063531] get_object(:bucket_name=>"aa",:key=>"original/58/Bansah_24.jpg")

Command :: identify -format %wx%h '/app/tmp/Bansah_2420120408-4-kogk2g.jpg[0]'
[paperclip] Saving attachments.

rake aborted!
An error has occurred, this and all later migrations canceled:

can't convert nil into String

レーキが中止されました!いくつかのイメージで機能するようですが、移行は失敗します。そのnilがどこから来ているのか、どうすればそれを防ぐことができるのか、私にはよくわかりません。誰かがこれを手伝ってくれますか?

ボーナス質問:これは、すでにアップロードされた画像の画像サイズを保存するタスクにアプローチするための遅延された方法ですか?

よろしくお願いします!

4

1 に答える 1

0

データベース内の一部の画像行の画像値がnullでした。このようなチェックがトリックを作りました:

Image.all.each do |image|

  # check that we have an image
  if image.image_file_size

    ...

  end

end
于 2012-04-15T19:46:55.070 に答える