Convém revisar as maneiras possíveis de escrever esse tipo de consulta esta resposta para aplicar condições a várias linhas em uma junção . Aqui está uma opção possível para implementar sua consulta no Rails usando 1B, a abordagem de subconsulta...
Defina uma consulta no
PostTag model que pegará o Post Valores de ID para uma determinada Tag nome:# PostTag.rb
def self.post_ids_for_tag(tag_name)
joins(:tag).where(tags: { name: tag_name }).select(:post_id)
end
Defina uma consulta no
Post model que pegará o Post registros para uma determinada Tag name, usando uma estrutura de subconsulta:# Post.rb
def self.for_tag(tag_name)
where("id IN (#{PostTag.post_ids_for_tag(tag_name).to_sql})")
end
Então você pode usar uma consulta como esta:
Post.for_tag("basil").for_tag("tomato")