Skip to content

Commit f85b8dc

Browse files
committed
refactor: news タスクを統合して一貫性を向上
Issue #1757 の一部として、分離されていた news:fetch と news:import_from_yaml を 単一の news:upsert タスクに統合。他の rake タスクとの設計一貫性を保つ。 変更内容: - lib/tasks/fetch_news.rake と lib/tasks/import_news.rake を削除 - lib/tasks/news.rake を新規作成(統合版) - RSS フィードからデータベースまでを一貫処理 - 後方互換性のためエイリアスタスクを提供 他のタスクとの一貫性: - podcasts:upsert (RSS → DB 直接) - dojo_event_services:upsert (YAML → DB 直接) - 同様の統合パターンを採用
1 parent fa7e909 commit f85b8dc

File tree

2 files changed

+49
-47
lines changed

2 files changed

+49
-47
lines changed

lib/tasks/import_news.rake

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ def item_to_hash(item)
3737
end
3838

3939
namespace :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

Comments
 (0)