@@ -37,14 +37,14 @@ def item_to_hash(item)
3737end
3838
3939namespace :news do
40- desc 'RSS フィードから最新ニュースを取得し、db/news.yml に書き出す '
41- task fetch : :environment do
40+ desc 'RSS フィードから最新ニュースを取得してデータベースに upsert '
41+ task upsert : :environment do
4242 # ロガー設定(ファイル+コンソール出力)
4343 file_logger = ActiveSupport ::Logger . new ( 'log/news.log' )
4444 console = ActiveSupport ::Logger . new ( STDOUT )
4545 logger = ActiveSupport ::BroadcastLogger . new ( file_logger , console )
4646
47- logger . info ( '==== START news:fetch ====' )
47+ logger . info ( '==== START news:upsert ====' )
4848
4949 # 既存の news.yml を読み込み
5050 yaml_path = Rails . root . join ( 'db' , 'news.yml' )
@@ -110,6 +110,7 @@ namespace :news do
110110 Time . parse ( item [ 'published_at' ] )
111111 } . reverse
112112
113+ # YAML ファイルに書き出し
113114 File . open ( 'db/news.yml' , 'w' ) do |f |
114115 formatted_items = sorted_items . map do |item |
115116 {
@@ -124,6 +125,49 @@ namespace :news do
124125 end
125126
126127 logger . info ( "✅ Wrote #{ sorted_items . size } items to db/news.yml (#{ truly_new_items_sorted . size } new, #{ updated_items . size } updated)" )
127- logger . info ( '==== END news:fetch ====' )
128+
129+ # データベースへの upsert 処理(統合部分)
130+ entries = sorted_items
131+ new_count = 0
132+ updated_count = 0
133+
134+ News . transaction do
135+ entries . each do |attrs |
136+ news = News . find_or_initialize_by ( url : attrs [ 'url' ] )
137+ is_new = news . new_record?
138+
139+ news . assign_attributes (
140+ title : attrs [ 'title' ] ,
141+ published_at : attrs [ 'published_at' ]
142+ )
143+
144+ if is_new || news . changed?
145+ news . save!
146+ status = is_new ? 'new' : 'updated'
147+ new_count += 1 if is_new
148+ updated_count += 1 unless is_new
149+
150+ logger . info "[News] #{ news . published_at . to_date } #{ news . title } (#{ status } )"
151+ end
152+ end
153+ end
154+
155+ logger . info "Imported #{ new_count + updated_count } items to database (#{ new_count } new, #{ updated_count } updated)."
156+ logger . info ( '==== END news:upsert ====' )
128157 end
129- end
158+
159+ # 後方互換性のためのエイリアス(既存のデプロイ設定などで使われている可能性)
160+ desc '※ Deprecated: news:upsert を使用してください'
161+ task fetch : :environment do
162+ logger = ActiveSupport ::Logger . new ( STDOUT )
163+ logger . warn "⚠️ news:fetch は非推奨です。news:upsert を使用してください"
164+ Rake ::Task [ 'news:upsert' ] . invoke
165+ end
166+
167+ desc '※ Deprecated: news:upsert を使用してください'
168+ task import_from_yaml : :environment do
169+ logger = ActiveSupport ::Logger . new ( STDOUT )
170+ logger . warn "⚠️ news:import_from_yaml は非推奨です。news:upsert を使用してください"
171+ Rake ::Task [ 'news:upsert' ] . invoke
172+ end
173+ end
0 commit comments