質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

2480閲覧

【rails】csvを使った処理をResqueで実装したい!

IPU

総合スコア283

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/08/18 10:49

編集2016/08/24 09:57

やりたいこと

現在、ユーザ登録をCSVで一括登録する機能を実装しています。
この機能でユーザ登録する際に、AD連携する処理をmodelsのbefore_saveに実装していましたが、ユーザの登録数が増えることを見込んで、AD連携する処理をバックグラウンドで処理する方法に変えようと考えています。

このバックグラウンドでの処理をResqueで行うとしています。

困っていること

今まで、modelsで行ってた処理をjobに移そうとしているのですが、以下のようなエラーが出てしまっています。

Unsupported argument type: CSV

調べた所、ActiveJobの引数に渡す際は、制限があるようで。。
何か良い対応方法あったら、教えてほしいです。

model側でAD連携処理を実装している時点

以下が、ActiveJobへ引っ越しする前の状態です。

ruby

1class User < ActiveRecord::Base 2 def self.import(param1,param2) 3 open(file.path, 'r:cp932:utf-8', undef: :replace) do |f| 4 csv = CSV.new(f, :headers => :first_row) 5 csv.each do |row| 6 # AD連携処理 7 end 8 end 9 end 10end

エラーが発生した際のコード

以下が、ActiveJob側へ引っ越しした際に書いてたコードです。
上の状態と変わらず、ただ、ActiveJobに投げてみただけという修正内容です。

ruby

1class User < ActiveRecord::Base 2 def self.import(file,system_id) 3 open(file.path, 'r:cp932:utf-8', undef: :replace) do |f| 4 csv = CSV.new(f, :headers => :first_row) 5 csv.each do |row| 6 UserRegisterJob.perform_later(row,system_id) 7 end 8 end 9 end 10end

以下が、jobs/user_register_job.rb側

ruby

1class UserRegisterJob < ActiveJob::Base 2 queue_as :default 3 4 def perform(row,system_id) 5 p row 6 end 7end

本当は、csvファイルの中身を1回で全て渡したかったんですが、まずは、1行ずつでも良いかと思い、上記の書き方をしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しました。
結論から言うと、csv形式のままだとActiveJobが受け取ってくれない(仕様)の為、
渡す前にcsvのデータを配列に修正してから連携することで実装出来ました。

ruby

1class User < ActiveRecord::Base 2 def self.import(file,system_id) 3 open(file.path, 'r:cp932:utf-8', undef: :replace) do |f| 4 csv = CSV.new(f, :headers => :first_row) 5 # csv形式を配列に置き換え 6 csv_array = csv.read.to_a 7 UserRegisterJob.perform_later(csv_array ,system_id) 8 end 9 end 10 end 11end

Job側でもらった値を処理する際、model側でやっていたAD連携処理に
あまり手を加えたくなかったので、Job側で配列をHashに直してから処理してます。

ruby

1class UserRegisterJob < ActiveJob::Base 2 queue_as :default 3 4 def perform(csv_array,system_id) 5 gyou_num = csv_array.count - 1 6 for i in 1..gyou_num 7 ary = [csv_array[0],csv_array[i]].transpose 8 ary_h = Hash[*ary.flatten] 9 # AD連携処理 10 end 11 end 12end

一応、問題は解決したのですが、何かもっと他に良いやり方がないのか
気になりますね。

何か、他のやり方を思いついた方は意見戴けると勉強になります。

投稿2016/08/24 09:57

IPU

総合スコア283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずエラー内容の意味を調べると良いと思います。

あと、エラー内容だけでは伝わらないと思うのでコードも書くべきかと。

投稿2016/08/24 02:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IPU

2016/08/24 09:15

質問の内容に何も答えていない。 質問の内容を見なくても書ける内容を書かれても評価出来ません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問