Usando expressões Postgres Regex para encontrar correspondências muito específicas

Coderwall tem tido problemas com certos avatares que geram erros 403 no console do navegador. Você provavelmente não notaria, a menos que tivesse suas ferramentas de desenvolvimento abertas enquanto estava navegando, mas havia um pouco mais de 25% de nossos avatares do Twitter que não eram renderizados corretamente devido à tentativa de conexão via HTTP em vez de HTTPS. ( E outras mudanças em como o Twitter resolve suas imagens de perfil, mas esse é um problema maior. ) Felizmente, com o poder dos seletores Ruby e Postgres Regex, é relativamente trivial encontrar e transformar os urls HTTP para usar HTTPS.

User.where("twitter_token is not null AND thumbnail_url ~ '^http:' AND thumbnail_url ~ 'twimg.com'").find_each(batch_size: 500) do |user|
begin
url
= URI.parse(user.profile_url)
puts
"Update #{user.username} because #{user.profile_url} appears to be HTTP."
url
.scheme = 'https'
user
.update_attribute(:thumbnail_url, url.to_s)
puts
" ==> #{user.profile_url}"
rescue URI::InvalidURIError
ap url

end
end

Nosso Usermodelo tem um campo thumbnail_urlque contém o URL para usuários que fazem login no Coderwall via OAuth. Como o problema era atualmente um problema predominantemente para logins do Twitter, e o LinkedIn não permite a busca de miniaturas via HTTPS, primeiro limitei a consulta a usuários de login do Twitter conhecidos.

Em seguida, quero filtrar por usuários que thumbnail_urljá não estão usando HTTPS. Esse número estava quase zero depois de algumas cutucadas que fiz para verificar o problema, mas é melhor prevenir do que remediar e também ajuda a reexecutar o script, não faz sentido selecionar um registro que já foi atualizado. Eu usei o matcher Postgres Regex, mas poderia muito bem ter usado o qual ainda pode utilizar alguns índices, se disponíveis. O vs ‘like’ também é preferível neste caso porque não faz distinção entre maiúsculas e minúsculasthumbnail_url ~ '^http:'thumbnail_url ilike 'http:%'ilike

A última parte da consulta também poderia ter sido, mas foi usada porque eu estava refatorando a partir de matchers que estavam dentro do bloco enquanto testava essa pequena funcionalidade.thumbnail_url ~ 'twimg.com'thumbnail_url ilike '%twimg.com%'

Então usei o para buscar os registros em lotes de 500 para evitar consultas excessivas. Dado este tamanho de lote, fiz cerca de 56+ s em vez de 28.000+.find_each(batch_size: 500)select

Podemos buscar avatares de alguns lugares diferentes, então abstraímos o url por meio do profile_urlmétodo. Eu poderia ter apenas buscado, thumbnail_urlmas não fez nenhuma diferença neste caso. Carrego o url em para que possa manipulá-lo sem manipulação de string. Eu converto o na instância do URI e atualizo o atributo no modelo. As instruções e (awesome_print) estão lá apenas para me ajudar enquanto observo a execução do processo.URI.parseschemeputsap

Embora a consulta pudesse ter sido simplificada por meio de ilikeinstruções curinga, as expressões Postgres Regex são muito úteis para combinar dados dentro de uma instância Postgres e permitem que você tenha um controle extremamente refinado sobre os resultados sem ter que extrair mais do que o necessário do banco de dados. Eles têm o custo de não serem fáceis de indexar, mas são uma ferramenta útil para ter à sua disposição quando você precisar.

Para corrigir os problemas do Avatar, provavelmente terei que buscar novamente o URL do perfil no Twitter, mas isso é outro artigo. 🙂