@@ -883,12 +883,41 @@ def build_cells_and_locks!(
883883
884884 CellInput . import cell_inputs_attributes , validate : false , batch_size : 500
885885 if prev_cell_outputs_attributes . present?
886- cell_ouput_ids = prev_cell_outputs_attributes . pluck ( :id )
887- CellOutput . live . where ( id : cell_ouput_ids ) . update_all ( status : :dead )
888886 prev_cell_outputs_attributes . each_slice ( 500 ) do |batch |
889- CellOutput . upsert_all ( batch ,
890- unique_by : %i[ tx_hash cell_index status ] ,
891- record_timestamps : true )
887+ updates = batch . map do |attr |
888+ [ attr [ :id ] , attr . slice ( :status , :consumed_by_id , :consumed_block_timestamp ) ]
889+ end . to_h
890+
891+ case_clauses = { status : [ ] , consumed_by_id : [ ] , consumed_block_timestamp : [ ] }
892+ ids = [ ]
893+
894+ updates . each do |id , attrs |
895+ ids << id
896+ attrs . each do |column , value |
897+ case_clauses [ column ] << "WHEN #{ id } THEN '#{ ActiveRecord ::Base . connection . quote ( value ) } '"
898+ end
899+ end
900+
901+ set_clauses = case_clauses . map do |column , clauses |
902+ if clauses . any?
903+ " #{ column } = CASE id\n #{ clauses . join ( "\n " ) } \n ELSE #{ column } \n END"
904+ else
905+ nil
906+ end
907+ end . compact . join ( ",\n " )
908+
909+ id_list = ids . join ( ', ' )
910+
911+ sql = <<-SQL
912+ UPDATE cell_outputs
913+ SET
914+ #{ set_clauses }
915+ WHERE id IN (#{ id_list } )
916+ SQL
917+
918+ # puts sql
919+
920+ ActiveRecord ::Base . connection . execute ( sql )
892921 end
893922 end
894923
@@ -1277,7 +1306,7 @@ def cell_input_attributes(input, ckb_transaction_id, local_block_id,
12771306 cell_type : previous_output . cell_type ,
12781307 tx_hash : input . previous_output . tx_hash ,
12791308 cell_index : input . previous_output . index ,
1280- status : "dead" ,
1309+ status : 1 ,
12811310 consumed_by_id : ckb_transaction_id ,
12821311 consumed_block_timestamp : @local_block . timestamp ,
12831312 } ,
0 commit comments