Skip to content

Commit 72d96d1

Browse files
committed
Add comments and update some functions
1 parent a7a5a89 commit 72d96d1

1 file changed

Lines changed: 37 additions & 18 deletions

File tree

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,71 @@
11
class UpdateTermItemRelation < ActiveRecord::Migration[7.0]
22
def up
33
facet = Facet.find_by!(name: 'Decade')
4-
old_term = Term.find_by!(facet: facet, value: 'After 1999')
4+
t_after_2019 = Term.find_by!(facet: facet, value: 'After 1999')
55

66
new_terms = {
77
(2000..2009) => Term.find_by!(facet: facet, value: '2000-2009'),
88
(2010..2019) => Term.find_by!(facet: facet, value: '2010-2019'),
99
(2020..) => Term.find_by!(facet: facet, value: 'After 2020')
1010
}
1111

12-
old_term.items.find_each do |item|
12+
invalid_items = []
13+
14+
t_after_2019.items.find_each do |item|
1315
year = integer_year(item.date)
14-
next unless year
16+
unless year
17+
invalid_items << { id: item.id, date: item.date }
18+
next
19+
end
1520

1621
target_term = new_terms.find { |range, _| range.cover?(year) }&.last
1722
next unless target_term
1823

19-
update_item(item, old_term, target_term)
20-
end
24+
re_assign_term_to_item(item, t_after_2019, target_term)
25+
end
26+
27+
if invalid_items.any?
28+
Rails.logger.warn("Skipped #{invalid_items.size} items due to invalid or missing dates. Example: #{invalid_items.first(10).map { |i| "ID #{i[:id]}: '#{i[:date]}'" }.join(', ')}")
29+
end
2130
end
2231

2332
def down
2433
facet = Facet.find_by!(name: 'Decade')
2534
target_term = Term.find_by!(facet: facet, value: 'After 1999')
26-
roll_back(facet, target_term, '2000-2009')
27-
roll_back(facet, target_term, '2010-2019')
28-
roll_back(facet, target_term, 'After 2020')
35+
move_term_back_to_item(facet, target_term, '2000-2009')
36+
move_term_back_to_item(facet, target_term, '2010-2019')
37+
move_term_back_to_item(facet, target_term, 'After 2020')
2938
end
3039

3140
private
32-
41+
3342
def integer_year(val)
34-
Integer(val)
35-
rescue ArgumentError, TypeError
36-
nil
37-
end
43+
return nil if val.nil?
3844

39-
def update_item(item, origin_term, target_term)
40-
return unless target_term & item & target_term
45+
# Try direct integer conversion
46+
begin
47+
return Integer(val)
48+
rescue ArgumentError, TypeError
49+
# Try to extract year from common date formats (e.g., "YYYY-MM-DD", "YYYY/MM/DD")
50+
if val.is_a?(String)
51+
if val =~ /\A(\d{4})[-\/]/
52+
return $1.to_i
53+
end
54+
end
55+
end
56+
end
4157

42-
item.terms.delete(origin_term)
58+
# Reassigns an item from the origin term to the target term, and removes the origin term from the item.
59+
def re_assign_term_to_item(item, origin_term, target_term)
4360
item.terms << target_term unless item.terms.include?(target_term)
61+
item.terms.delete(origin_term)
4462
end
4563

46-
def roll_back(facet, target_term, origin_term_value)
64+
# Rolls back term assignment from origin_term_value to target_term for all items.
65+
def move_term_back_to_item(facet, target_term, origin_term_value)
4766
origin_term = Term.find_by!(facet: facet, value: origin_term_value)
4867
origin_term.items.find_each do |item|
49-
update_item(item, origin_term, target_term)
68+
re_assign_term_to_item(item, origin_term, target_term)
5069
end
5170
end
5271
end

0 commit comments

Comments
 (0)