Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Ambos atualizarão um objeto sem precisar informar explicitamente o AR para atualizar.
A API do Rails diz:
para update_attribute
Atualiza um único atributo e salva o registro sem passar pelo procedimento de validação normal. Isso é especialmente útil para sinalizadores booleanos em registros existentes. O método update_attribute regular no Base é substituído por esse quando o módulo de validações é misturado, o que é por padrão.
para update_attributes
Atualiza todos os atributos do Hash passado e salva o registro. Se o objeto for inválido, o salvamento falhará e falso será retornado.
Portanto, se não quiser validar o objeto, devo usar o update_attribute. E se eu tiver essa atualização em um before_save, ele fará o stackoverflow?
Minha pergunta é: update_attribute também ignora o antes de salvar ou apenas a validação.
Além disso, qual é a sintaxe correta para passar um hash para update_attributes ... confira meu exemplo na parte superior.
fonte
update_attribute
declaração dentro de umbefore_save
retorno de chamada? Não consigo pensar em uma boa razão para isso.before_save
retorno de chamada). Fe em vez deupdate_attribute(:discount, 0.1) if amount > 100
você poderia fazerdiscount = 0.1 if amount > 100
.update_attribute
chamasave
o objeto, o que é desnecessário nesse caso, pois a instrução está dentro de umbefore_save
retorno de chamada e será salva de qualquer maneira. Espero que faça sentido.Respostas:
Por favor, consulte
update_attribute
. Ao clicar em show source, você receberá o código a seguire agora consulte
update_attributes
e veja o código que você obtéma diferença entre dois é
update_attribute
usossave(false)
enquantoupdate_attributes
usossave
ou você pode dizersave(true)
.Desculpe pela descrição longa, mas o que quero dizer é importante.
save(perform_validation = true)
, seperform_validation
for falso, ignora (ignora a palavra apropriada) todas as validações associadassave
.Para segunda pergunta
Seu exemplo está correto.
ou
ou se você obtiver todos os campos de dados e nome em um hash, diga
params[:user]
aqui, use apenasfonte
Rails 3
. Diz claramente nos comentários na fonte que "os retornos de chamada são invocados".update_attributes
agora é um apelido paraupdate
Dica:
update_attribute
está sendo descontinuado no Rails 4 através do Commit a7f4b0a1 . Remove aupdate_attribute
favor deupdate_column
.fonte
update_attribute
pula validação, mas respeita chamadas de retorno,update_column
irá saltar tanto validação e chamadas de retorno e rotina de actualização:updated_at
,update
é a função normal que vão respeitar os dois retornos e validaçãoupdate_column
não é preterido, masupdate_columns(name: value)
é favorecido.reset_column
foi removido.update_attribute
Este método atualiza o atributo único do objeto sem chamar a validação baseada em modelo.
update_attributes
Esse método atualiza vários atributos de um único objeto e também passa na validação baseada em modelo.
Espero que esta resposta esclareça quando usar qual método de registro ativo.
fonte
Também é importante notar que
update_attribute
, com , o atributo desejado a ser atualizado não precisa estar na lista brancaattr_accessible
para atualizá-lo, em oposição ao método de atribuição em massa,update_attributes
que atualizará apenas osattr_accessible
atributos especificados.fonte
update_attribute
simplesmente atualiza apenas um atributo de um modelo, mas podemos passar vários atributos noupdate_attributes
métodoExemplo:
Passa na validação
não é atualizado se a validação falhar.
fonte
Ótimas respostas. observe que quanto ao ruby 1.9 e acima, você poderia (e acho que deveria) usar a nova sintaxe de hash para update_attributes:
fonte
Você pode estar interessado em visitar este post do blog sobre todas as formas possíveis de atribuir um atributo ou atualizar um registro (atualizado para o Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Por exemplo, ele difere em aspectos como executar validações, tocar em updated_at do objeto ou acionar retornos de chamada.Como resposta à pergunta do OP,
update_attribute
não passa retornos de chamada.fonte
update_attribute
eupdate_attributes
são semelhantes, mas com uma grande diferença:update_attribute
não executa validações.Além disso:
update_attribute
é usado para atualizar o registro com atributo único .update_attributes
é usado para atualizar o registro com vários atributos.Esses dois métodos são realmente fáceis de confundir, devido a nomes e trabalhos semelhantes. Portanto,
update_attribute
está sendo removido em favor deupdate_column
.Agora, no Rails4, você pode usar
Model.update_column(:column_name, column_value)
no local deModel.update_attribute(:column_name, column_value)
Clique aqui para obter mais informações sobre
update_column
.fonte
Para responder à sua pergunta,
update_attribute
pule as "validações" de pré-salvamento, mas ele ainda executa outros retornos de chamada comoafter_save
etc. Portanto, se você realmente quiser "apenas atualizar a coluna e pular qualquer crupto AR", precisará usar (aparentemente)Model.update_all(...)
consulte https://stackoverflow.com/a/7243777/32453fonte
Recentemente, me deparei com problemas de
update_attribute
vs.update_attributes
e validação, nomes tão semelhantes, comportamentos tão diferentes, tão confusos.Para passar o hash
update_attribute
e ignorar a validação, você pode:fonte
Acho que sua pergunta é se ter um update_attribute em um before_save levará a um loop infinito (de chamadas update_attribute em retornos de chamada before_save, originalmente acionadas por uma chamada update_attribute)
Tenho certeza de que ignora o retorno de chamada before_save, pois na verdade não salva o registro. Você também pode salvar um registro sem acionar validações usando
Model.save false
fonte