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