Skip to main content
6 of 6
deleted 29 characters in body
tokland
  • 11.1k
  • 1
  • 20
  • 25

Some comments on your code:

  • Keep the line length below 80-100 or the code becomes unreadable.
  • self[:active] == false -> !self[:active]
  • Checks should be terser, encapsulate logic in methods.
  • A return at the end of a code block is neither necessary nor idiomatic.
  • [Subjective] I usually prefer full-fledge conditionals to guards, indentation helps a lot to see what's going on.

In a first refactor, I'd write a more readable case:

def active?
  case 
  when (!self[:active] && !ignore_column) || suspended || completed_at
    false
  when failed_attempts >= MAX_FAILED_ATTEMPTS
    if suppress_error_emails
      false
    end
      message = "Too many failed attempts for task execution. " + 
        "#{failed_attempts}/#{MAX_FAILED_ATTEMPTS} failed attempts for Task #{id}."
      SystemMailer.error(message: message)
    end
  # ...
  # more conditions here, you get the idea
  # ...
  when template && 
       (status_opted_out? || con_mktg_opted_out? || user_mktg_opted_out?)
    false
  else
    true
  end
end

On a second refactor, I'd probably move all logic to separate methods. Now you could write:

def active?
  condition1? && condition2? && ... && conditionN?
end
tokland
  • 11.1k
  • 1
  • 20
  • 25