@@ -10,6 +10,8 @@ class Message < ApplicationRecord
1010 # https://blade.ruby-lang.org/ruby-talk/410000 is not.
1111 self . skip_time_zone_conversion_for_attributes = [ :published_at ]
1212
13+ attr_accessor :children
14+
1315 class << self
1416 def from_mail ( mail , list , list_seq )
1517 body = Kconv . toutf8 mail . body . raw_source
@@ -33,13 +35,13 @@ def from_mail(mail, list, list_seq)
3335
3436 # mail.in_reply_to returns strange Array object in some cases (?), so let's use the raw value
3537 parent_message_id_header = extract_message_id_from_in_reply_to ( mail . header [ :in_reply_to ] &.value )
36- parent_message_id = Message . where ( message_id_header : parent_message_id_header ) . pick ( :id ) if parent_message_id_header
38+ parent_message_id = Message . where ( list_id : list . id , message_id_header : parent_message_id_header ) . pick ( :id ) if parent_message_id_header
3739 if !parent_message_id && ( String === mail . references )
38- parent_message_id = Message . where ( message_id_header : mail . references ) . pick ( :id )
40+ parent_message_id = Message . where ( list_id : list . id , message_id_header : mail . references ) . pick ( :id )
3941 end
4042 if !parent_message_id && ( Array === mail . references )
4143 mail . references . compact . each do |ref |
42- break if ( parent_message_id = Message . where ( message_id_header : ref ) . pick ( :id ) )
44+ break if ( parent_message_id = Message . where ( list_id : list . id , message_id_header : ref ) . pick ( :id ) )
4345 end
4446 end
4547
@@ -85,6 +87,10 @@ def from_string(str)
8587 end
8688 end
8789
90+ def count_recursively ( count = 0 )
91+ count + 1 + ( children &.sum ( &:count_recursively ) || 0 )
92+ end
93+
8894 def reload_from_s3 ( s3_client = Aws ::S3 ::Client . new ( region : BLADE_BUCKET_REGION ) )
8995 m = Message . from_s3 ( List . find_by_id ( self . list_id ) . name , self . list_seq , s3_client )
9096
0 commit comments