Some comments on your code:
- MaximumKeep the line length: below 80-100 is ok, more isor the code becomes unreadable.
self[:active] == false
->!self[:active]
- Checks should be terser, encapsulate loginlogic in separate methods.
return true
: a Areturn
at the end of a code block is neither necessary nor idiomatic.- Subjective:[Subjective] I usually prefer full-fledge conditionals to guards, indentation helps a lot to see what's going on, IMO.
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 gomove all the way and abstract everthinglogic to separate methods. Now you could write:
def active?
condition1? && condition2? && ... && conditionN?
end