quando não usar memoização de trilhos

Recentemente, estava trabalhando em algum código e encontrei um bom exemplo de quando não usar a memoização do Rails. O exemplo a seguir é provavelmente extremamente óbvio, mas foi esquecido por alguns desenvolvedores de Rails experientes.

Então, digamos que nosso modelo armazene uma taxa de marcação para cada produto em sua tabela. Queremos atribuir um valor calculado a essa taxa com base na loja que vende o produto. Portanto, fazemos isso com o código do modelo abaixo.

before_validation :set_defaults

def markup_rate
self[:markup_rate] ||= some_calcuation_code_here
end

private

def set_defaults
self.markup_rate
end

O que está errado com isto? A atribuição em massa definirá estes por meio de parâmetros, se aprovada. Qualquer um poderia passar pelo markup_rate como um parâmetro e realmente atrapalhar seus cálculos de taxas (assustador). Alguns pensariam que você poderia simplesmente adicionar

attr_protected :markup_rate

e tudo pronto, certo? Infelizmente não, isso não funcionará aqui. Estamos atribuindo a taxa de marcação fora de nossa atribuição em massa , portanto, attr_protected não funcionará aqui.

TL; DR; não use memoização em campos que não devem ser atribuídos via mass_assignment