Rails – filtrar usando modelo de junção em has_many por meio

Então, você deseja filtrar usando um escopo por meio de uma associação (não apenas para uso em has_many, mas acho que este exemplo realmente mostra como #merge brilha!).

Dados os seguintes modelos:

class Person
has_many
:accounts
has_many
:computers, through: :accounts
end

class Account
belongs_to
:person
belongs_to
:computer

scope
:administrators, -> { where(role: 'administrator') }
end

class Computer
has_many
:accounts
has_many
:people, through: :accounts
end

A filtragem usando um modelo de junção em um has_many through pode ser realizada ingenuamente com o seguinte. Aqui, suponha que temos uma instância de pessoa e desejamos localizar todos os computadores onde eles são administradores.

person.accounts.administrators.map(&:computer)  # ewww

Podemos fazer isso melhor usando ActiveRecord :: SpawnMethods # merge !

person.computers.merge(Account.administrators)  # very nice!

Sintaxe mais limpa, consulta do clã. Vitória vitória