Configurar:
rails new testing --minimal
cd testing
bin/rails g model Property name handle --no-timestamps
bin/rails db:migrate
sed -i '2i \ normalizes :handle, with: ->(handle) { handle.to_s.underscore.parameterize(separator: "_") }' app/models/property.rb
# app/models/property.rb
class Property < ApplicationRecord
normalizes :handle, with: ->(handle) { handle.to_s.underscore.parameterize(separator: "_") }
end
handle
a normalização é esperada ao criar/atualizar um registro e ao pesquisar:
Property.create(name: "My property", handle: " My property ")
#=> #<Property:0x00007f9b3a0e2e50 id: 1, name: "My property", handle: "my_property">
# ^^^^^^^^^^^
Property.where(handle: " myProperty ").to_sql
#=> "SELECT \"properties\".* FROM \"properties\" WHERE \"properties\".\"handle\" = 'my_property'"
# ^^^^^^^^^^^
Mas ao construir uma LIKE
consulta com arel os %
caracteres também são removidos, o que deveria fazer parte da consulta:
Property.arel_table[:handle].matches("%prop%").to_sql
#=> "\"properties\".\"handle\" LIKE 'prop'"
# ^^^^
Posso evitar fazer where("handle LIKE ?")
e manter sempre handle
normalizado?