teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

CSVインポートのコードを追加しました。

2021/02/28 05:30

投稿

pancho
pancho

スコア12

title CHANGED
File without changes
body CHANGED
@@ -13,5 +13,79 @@
13
13
  ### 発生している問題
14
14
 
15
15
  色々と検索してみるのですが、CSVのインポート機能の実装の記事は有るのですが
16
- 起動時などに「指定場所(社内サーバやPCの指定フォルダー)に有るCSVファイルを読み込みに行く」ような記事を見付ける事が出来ませんでし
16
+ 起動時などに「指定場所(社内サーバやPCの指定フォルダー)に有るCSVファイルを読み込みに行く」ような記事を見付ける事が出来なかっので
17
+ その部分に対してはまだ実装していません。
17
- そのような機能が実装できるのか、そして実装方法が記載されているページのURLなどを教えていただけると幸いです。
18
+ そのような機能が実装できるのか、そして実装方法が記載されているページのURLなどを教えていただけると幸いです。
19
+
20
+ ### ソースコード
21
+ CSVインポートのコードです。
22
+
23
+ model/Cashflow
24
+ ```
25
+ class Cashflow < ApplicationRecord
26
+
27
+ def self.import(file)
28
+ CSV.foreach(file.path, headers: :first_row, encoding: Encoding::CP932 ) do |row|
29
+ cashflow = find_by(id: row["id"]) || new
30
+ cashflow.attributes = row.to_hash.slice(*updatable_attributes)
31
+ cashflow.save!
32
+ end
33
+ end
34
+
35
+ def self.updatable_attributes
36
+ ["id", "d1_id", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
37
+ "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20",
38
+ "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30",
39
+ "d31", "d32", "d33", "d34", "d35", "d36", "d37", "d38", "d39", "d40",
40
+ "d41", "d42", "d43", "d44", "d45", "d46", "d47", "d48", "d49", "d50",
41
+ "d51", "d52", "d53", "d54", "d55", "d56", "d57", "d58", "d59", "d60",
42
+ "d61", "d62", "d63", "d64", "d65", "d66", "d67", "d68", "d69", "d70",
43
+ "d71", "d72", "d73", "d74", "d75", "d76", "d77", "d78", "d79", "d80",
44
+ "d81", "d82", "d83", "d84", "d85", "d86", "d87", "d88", "d89", "d90",
45
+ "d91", "d92", "d93", "d94", "d95", "d96", "d97", "d98", "d99", "d100",
46
+ "d101", "d102", "d103", "d104", "d105", "d106", "d107", "d108", "d109", "d110",
47
+ "d111", "d112", "d113", "d114", "d115", "d116", "d117", "d118", "d119", "d120",
48
+ "d121", "d122", "d123", "d124", "d125", "d126", "d127", "d128", "d129", "d130",
49
+ "d131", "d132", "d133", "d134", "d135", "d136", "d137", "d138", "d139", "d140",
50
+ "d141", "d142", "d143", "d144", "d145", "d146", "d147", "d148", "d149", "d150",
51
+ "d151", "d152", "d153", "d154", "d155", "d156", "d157", "d158", "d159", "d160",
52
+ "d161", "d162", "d163", "d164", "d165", "d166", "d167", "d168", "d169", "d170",
53
+ "d171", "d172", "d173", "d174", "d175", "d176", "d177", "d178", "d179", "d180",
54
+ "d181", "d182", "d183", "d184", "d185", "d186", "d187", "d188", "d189", "d190",
55
+ "d191", "d192", "d193", "d194", "d195", "d196", "d197", "d198", "d199", "d200",
56
+ "d201", "d202", "d203", "d204", "d205", "d206", "d207", "d208", "d209", "d210",
57
+ "d211", "d212", "d213", "d214", "d215", "d216", "d217", "d218", "d219", "d220",
58
+ "d221", "d222", "d223", "d224", "d225", "d226", "d227", "d228", "d229", "d230",
59
+ "d231", "d232", "d233", "d234", "d235", "d236", "d237", "d238", "d239", "d240",
60
+ "d241", "d242", "d243", "d244", "d245", "d246", "d247", "d248", "d249", "d250",
61
+ "d251", "d252", "d253", "d254", "d255", "d256", "d257", "d258", "d259", "d260",
62
+ "d261", "d262", "d263", "d264", "d265", "d266", "d267", "d268", "d269", "d270",
63
+ "d271", "d272", "d273", "d274", "d275", "d276", "d277", "d278", "d279", "d280",
64
+ "d281", "d282", "d283", "d284", "d285", "d286"]
65
+ end
66
+ end
67
+ ```
68
+ Controller/Cashflows
69
+ ```
70
+ class CashflowsController < ApplicationController
71
+ before_action :require_user_logged_in
72
+ before_action :period_check
73
+
74
+ def index
75
+ @cashflows = Cashflow.all.order(id: :asc).page(params[:page]).per(50)
76
+ end
77
+
78
+ def import
79
+ Cashflow.import(params[:file])
80
+ redirect_to root_url
81
+ end
82
+ end
83
+ ```
84
+ view/Cashflow/index
85
+ ```
86
+ <h1>キャッシュフロー読み込み</h1>
87
+ <%= form_with url: import_cashflows_path, local: true do |form| %>
88
+ <%= form.file_field :file %>
89
+ <%= form.submit %>
90
+ <% end %>
91
+ ```