Adicione inverse_of para atualizar para Rails 3.2.11 (para consertar a falha de segurança)

Como você já deve saber, há um grave problema de segurança nas versões Rails anteriores a 3.2.11, 3.1.10, 3.0.19 e 2.3.15.

Se você está executando o Rails 3.2.8 ou inferior, e ainda não adicionou inverse_of ao seu ActiverRecord :: Associations , você pode estar em um grande monte de mudanças antes da atualização.

Atualizando automaticamente seus modelos

Criei um pequeno script para atualizar seus modelos. Não é tão bonito, mas faz o que é esperado: atualiza as associações has_many e belongs_to com a cláusula inverse_of correta .

add_inverse_of.rb

#!/usr/bin/env ruby
require 'active_support/inflector'

Dir.glob("#{Dir.pwd}/*.rb") do |file|
basename
= File.basename(file, ".rb")

lines
= IO.readlines(file).map do |line|
if line.match(/(belongs_to|has_many (((?!through)(?!inverse_of).)*)$)/)
line
.sub(/has_many ([^n]*)/){|m| "has_many #{$1}, inverse_of: :#{basename}"}.sub(/belongs_to ([^n]*)/){|m| "belongs_to #{$1}, inverse_of: :#{basename.pluralize}"}
else
line

end
end

File.open(file, 'w') do |file|
file
.puts lines
end
end

É muito simples de usar. Se você tiver Rails instalado em seu ambiente RVM , basta executar o seguinte na raiz de seu aplicativo Rails:

$ cd app/models
$ ruby
<location of the script>/add_inverse_of.rb

Se você tiver um ambiente Ruby limpo, pode ser necessário executar $ bundle exec ruby add_inverse_of.rb

Corrigindo outros problemas

Você pode não ter criado todas as associações de seu modelo como bidirecionais em primeiro lugar, já que as versões anteriores do Rails não o forçavam. Este é um bom momento para corrigir a consistência de seu aplicativo e verificar suas fábricas e especificações (ou qualquer outra combinação de acessórios e testes) para verificar se seu aplicativo ainda funciona conforme o esperado.