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")