SeedFuのWriterでマスタデータ出力時にDate型カラムがダブルクォートされずに出力されてロード時にエラーになる

スポンサーリンク

以下のrakeタスクで既存DBからSeedFuで読み込むためのファイルを生成した。

desc 'generate seed-fu'
task master: :environment do |t|
    SeedFu::Writer.write('./db/fixtures/master.rb', class_name: 'Master', constraints: [:hoge_key]) do |w|
        Master.all.each do |x|
            w << x.as_json(except: [:created_at, :updated_at])
        end
    end
end

そして、いざ出力されたファイルを別サーバで読み込もうと思ったら、エラーが発生。
エラー文言は無くなってしまったが、要はDate型カラムの値が

2017-12-31

から

Sun, 31 Dec 2017

みたいのに変換されていて、かつダブルクォートで囲まれていなかったためだった。

さて、困った時のGoogle先生。

Writer uses inspect to serialize object

凄い対処療法っぽいやり方だけど、とりあえずこれで直った。

SeedFuのWriterを使っているrakeタスクに追記する

eval <<-EOS
    class ::ActiveSupport::TimeWithZone
      def inspect
        "DateTime.iso8601(\#{iso8601.inspect})"
      end
    end

    class ::DateTime
      def inspect
        "DateTime.iso8601(\#{iso8601.inspect})"
      end
    end

    class ::Date
      def inspect
        "Date.iso8601(\#{iso8601.inspect})"
      end
    end

    class ::Time
      def inspect
        "Time.iso8601(\#{iso8601.inspect})"
      end
    end
EOS

Writer should use code/iso8601 for date/time/datetime, not inspect

こういうプルリクが2014年に出ているけど、マージされていない。
何でだろうー。

コメント

タイトルとURLをコピーしました