`user_associations` is all ActiveRecord associations on the user model (belongs_to, has_one, etc.). e.g. For this model:

```ruby
class User < ActiveRecord::Base
  has_many :comments
  belongs_to :company
end
```

`user_associations` would be:

```ruby
[:comments, :company]
```

`company_association_proc` is the Proc in `config/initializers/intercom.rb` that tells us how we go from user -> company. What we do here is pass it an instance of `MethodCatcher` (instead of a user) which uses `method_missing` to record all method calls that are sent to it. The idea is that we can try and work out specifically which association the user is using for companies.

So if we have a config file like:

```ruby
config.user.company_association = Proc.new { |user| user.company }
```

We take this proc and pass it a `MethodCatcher` instance:

```ruby
  company_association_proc.call(method_catcher)
```

Which would capture the following:

```ruby
  method_catcher.methods_called => [:company]
```

We then look for the intersection of methods that were called in the `company_association_proc` and `user_associations`:

```ruby
  method_catcher & user_associations => [:company]
```

In this case, since there's only 1 match we would return `:company`. If there's more than 1 match we don't wanna guess, so we return nil.

----

It's slightly complex but the point is to pick out the company association so we can eager load all of a companies associations too.

Does this make sense?