Pergunta

Eu estou olhando para uma variação de #save método que só salvar atributos que não possuem erros inerentes a eles.Assim, um modelo pode ser atualizado sem ser válido no geral, e isso vai ainda impedir salvar dados inválidos para o banco de dados.

Por "atributos válidos", quero dizer, aqueles atributos que lhe nil quando chamar @model_instance.erros.em (atributo)

Alguém tem uma idéia de como fazer isso?

Até agora, eu tenho o seguinte:

def save_valid_attributes 
 valid? 
 update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m} 
end 

Isso funciona se não houver tratamento feito em missão, que no meu caso não é.Por exemplo, eu tenho uma coluna de banco de dados "data_inicial", e dois métodos definidos:

def nice_start_date=(startdate)
 self.start_date = Chronic.parse(startdate) || startdate
end

def nice_start_date
 self.start_date.to_s
end

Estes dois métodos permitem-me para analisar correctamente o usuário entra datas usando Crônica antes de salvar.Então, a segunda forma de fazer isso, um atributo de cada vez:

def save_valid_attributes(attrib) 
  valid?
  attrib.each{|(k,v)| send("${k}=", v); save; reload)
end

O modelo precisa ser recarregado a cada vez, já que, se uma das datas é inválido e não salvar, ele irá impedir que todos os outros atributos de verão.

Não há melhor maneira de fazer isso?Tenho certeza de que esse não é um problema incomum nos Trilhos do mundo, eu simplesmente não consigo encontrar nada no Google universo de conhecimento.

Foi útil?

Solução

Eu não tenho certeza de quanta sorte você vai ter com este, sem um monte de andar.

Não importa o quão SECO e OO e fácil o seu quadro torna as coisas ( que é neste caso um monte =) você ainda tem a se lembrar de sua execução na frente de um pântano padrão de banco de dados relacional, que tem atômica compromete-se como um dos definição recursos.Ele foi projetado desde o início para que certifique-se de que todas as alterações sejam cometidas, ou nenhum.

Você está efetivamente vai ser mais de equitação esta funcionalidade padrão com algo que vai 100% contra o grão de como rails + foi projetado para funcionar.Esta é susceptível de conduzir (como já disse) para dados inconsistentes.

Tendo dito isso ...é sempre possível.Gostaria de olhar ao longo das linhas de manual de validação de atributos que você gosta e, em seguida, usando o método interno object.update_attribute_with_validation_skipping.

Boa sorte!

Outras dicas

Você pode substituir #save como esta:

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end

Isto irá repor todos os atributos com erros inerentes ao seu valor original.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top