Let’s say you need to get I18n translations from different scopes depending on the logic, and only some of them are present in such overrides, while others need to fallback to the default scope. You build a logic like that:

def complex_translate
  some_scope = [:first, :second]
  fallback_scope = [:first]

  I18n.exists?(key, scope: some_scope) ? I18n.t(key, scope: some_scope) : I18n.t(key, scope: fallback_scope)
end

But then you find out, that exists? is not actually takes scope into the account at all (it always returning false for any combination of key and scope). As when you look for implementation (good thing you can do cmd+B in RubyMine and go directly for the implementation), you see this call: config.backend.exists?(locale, key, options). And when you go to the backend exist? definition you see next:

def exists?(locale, key, options = EMPTY_HASH)
  lookup(locale, key) != nil
end

So what can be a way out? (Don’t say monkey patching, you are going to regret that later) It’s actually quite simple, you have to use bang version of translate and catch exception from it:

def complex_translate
  some_scope = [:first, :second]
  fallback_scope = [:first]

  I18n.t!(key, scope: some_scope)
rescue I18n::MissingTranslationData
  I18n.t(key, scope: fallback_scope)
end