Skip to content

Commit

Permalink
Handle re-ranking failure by aborting the save with error
Browse files Browse the repository at this point in the history
Rely on ActiveRecord.version. Is in support AR versions

see e.g.
https://github.com/rails/rails/blob/4-0-stable/activerecord/lib/active_record/version.rb
  • Loading branch information
bf4 committed Jul 23, 2019
1 parent b445007 commit 1263b00
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
39 changes: 37 additions & 2 deletions lib/ranked-model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,49 @@ def self.included base
}
end

rails_version = ActiveRecord.version.to_s
if rails_version < '5.0'
base.module_eval <<-EOS.strip_heredoc, __FILE__, __LINE__ + 1
def handle_ranking_return_value(return_value)
@ranked_model_ranking_succeeded
end
def abort_handle_ranking
nil
end
EOS
end
end

private

def handle_ranking
self.class.rankers.each do |ranker|
ranker.with(self).handle_ranking
@ranked_model_ranking_succeeded = true
return_value = self.class.rankers.each do |ranker|
ranking_failed_reason = catch :ranking_failed do
ranker.with(self).handle_ranking
nil
end
handle_ranking_failure(ranker, ranking_failed_reason)
end
handle_ranking_return_value(return_value)
end

def handle_ranking_failure(ranker, ranking_failed_reason)
return if ranking_failed_reason.nil?
errors.add ranker.column, ranking_failed_reason
@ranked_model_ranking_succeeded = false
abort_handle_ranking
end

# May be overriden
def handle_ranking_return_value(return_value)
return_value
end

# May be overriden
def abort_handle_ranking
throw :abort
end

module ClassMethods
Expand Down
7 changes: 3 additions & 4 deletions lib/ranked-model/ranker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -185,10 +185,10 @@ def rearrange_ranks
_scope = finder
escaped_column = instance_class.ranker_connection_class.connection.quote_column_name ranker.column
if current_first.nil?
return if handle_cannot_rearrange_ranks("current_first is nil").nil?
return if handle_cannot_rearrange_ranks("current_first not found").nil?
end
if current_last.nil?
return if handle_cannot_rearrange_ranks("current_last is nil").nil?
return if handle_cannot_rearrange_ranks("current_last not found").nil?
end
# If there is room at the bottom of the list and we're added to the very top of the list...
if current_first.rank && current_first.rank > RankedModel::MIN_RANK_VALUE && rank == RankedModel::MAX_RANK_VALUE
Expand All @@ -215,8 +215,7 @@ def rearrange_ranks
end

def handle_cannot_rearrange_ranks(message)
logger.warn "[RANKED_MODEL] #{message}. Skipping re-ranking of #{instance.model_name.name} #{instance.id}"
nil
throw :ranking_failed, "Could not re-rank: #{message}."
end

def rebalance_ranks
Expand Down

0 comments on commit 1263b00

Please sign in to comment.