Uma maneira de evitar classes com muito conhecimento de nosso domínio é ter associações ActiveRecord assimétricas.
Por exemplo. Em nosso sistema de faturamento, temos um conjunto de faturas relacionadas a uma conta específica. Apenas faça:
class Invoice < ActiveRecord::Base
belongs_to :account
def self.by_account(account)
where(account_id: account.id)
end
end
Observe que não declaramos que uma conta tem muitas faturas, porque essa classe não deve estar ciente desse conceito.
Isso tem um impacto em como estamos acostumados a usar APIs de AR: de account.invoices
a Invoice.by_account(account)
, que pode ser um pouco barulhento, mas com certeza tem a vantagem de manter suas classes mais leves.