Rails: update_attribute vs update_attributes -- ruby-on-rails поле с участием callback поле с участием update-attributes пол Связанный проблема

Rails: update_attribute vs update_attributes


260
vote

проблема

русский
 <код> Object.update_attribute(:only_one_field, "Some Value") Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")   

Оба из них будут обновлять объект без явного сообщения AR для обновления.

Rails API говорит:

для update_attribute

Обновляет один атрибут и сохраняет запись, не проходя через нормальную процедуру проверки. Это особенно полезно для логических флагов на существующих записях. Регулярный метод update_attribute в базе заменяется этим, когда модуль проверки смешивается, который он по умолчанию.

для update_attributes

Обновляет все атрибуты из пропущенных хэш и сохраняет запись. Если объект недействителен, сохранение будет выполнено, и false будет возвращена.

Так что, если я не хочу, чтобы объект проверил, я должен использовать update_attribute. Что, если у меня будет это обновление на Ado_save, пройдет ли это Stackoverflow?

Мой вопрос - это обновление_Attribute также обойти перед сохранением или просто проверкой.

Кроме того, какой правильный синтаксис для передачи хэш для обновления_атрибаутов ... Проверьте мой пример вверху.

Английский оригинал
Object.update_attribute(:only_one_field, "Some Value") Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3") 

Both of these will update an object without having to explicitly tell AR to update.

Rails API says:

for update_attribute

Updates a single attribute and saves the record without going through the normal validation procedure. This is especially useful for boolean flags on existing records. The regular update_attribute method in Base is replaced with this when the validations module is mixed in, which it is by default.

for update_attributes

Updates all the attributes from the passed-in Hash and saves the record. If the object is invalid, the saving will fail and false will be returned.

So if I don't want to have the object validated I should use update_attribute. What if I have this update on a before_save, will it stackoverflow?

My question is does update_attribute also bypass the before save or just the validation.

Also, what is the correct syntax to pass a hash to update_attributes... check out my example at the top.

</div
        
         
         

Список ответов

335
 
vote
vote
Лучший ответ
 

Пожалуйста, обратитесь к <Код> update_attribute . При нажатии на Show Source вы получите следующий код

 <код>       # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614 2614:       def update_attribute(name, value) 2615:         send(name.to_s + '=', value) 2616:         save(false) 2617:       end   

А теперь обратитесь <код> update_attributes и посмотрите на свой код, который вы получаете

 <код>       # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621 2621:       def update_attributes(attributes) 2622:         self.attributes = attributes 2623:         save 2624:       end   

Разница между двумя - <код> update_attribute Используется <код> save(false) , тогда как <Код> update_attributes использует <Код> save или вы можете сказать <Код> save(true) .

Извините за долгое описание, но то, что я хочу сказать, важно. <код> update_attribute0 , если <код> update_attribute1 Ложно, он обходится (пропускает будет правильное слово) все Валидации с <код> update_attribute2 .

для второго вопроса

Кроме того, какой правильный синтаксис для передачи хэш для обновления_атрибаутов ... Проверьте мой пример вверху.

Ваш пример правильный.

 <код> update_attribute3  

или

 <код> update_attribute4  

или если вы получите все поля данных и AMP; Имя в хешске, скажем <код> update_attribute5 здесь использовать только

 <код> update_attribute6  
 

Please refer to update_attribute. On clicking show source you will get following code

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614 2614:       def update_attribute(name, value) 2615:         send(name.to_s + '=', value) 2616:         save(false) 2617:       end 

and now refer update_attributes and look at its code you get

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621 2621:       def update_attributes(attributes) 2622:         self.attributes = attributes 2623:         save 2624:       end 

the difference between two is update_attribute uses save(false) whereas update_attributes uses save or you can say save(true).

Sorry for the long description but what I want to say is important. save(perform_validation = true), if perform_validation is false it bypasses (skips will be the proper word) all the validations associated with save.

For second question

Also, what is the correct syntax to pass a hash to update_attributes... check out my example at the top.

Your example is correct.

Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3") 

or

Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3" 

or if you get all fields data & name in a hash say params[:user] here use just

Object.update_attributes(params[:user]) 
</div
 
 
       
       
74
 
vote

Совет: <Код> update_attribute устанавливается в Rails 4 через Commun A7F4B0A1 . Это удаляет <код> update_attribute в пользу <код> update_column .

 

Tip: update_attribute is being deprecated in Rails 4 via Commit a7f4b0a1. It removes update_attribute in favor of update_column.

</div
 
 
   
   
15
 
vote

update_attribute

Этот метод обновляет один атрибут объекта без вызывающей модели на основе модели.

 <код> obj = Model.find_by_id(params[:id]) obj.update_attribute :language, "java"    

update_attributes

Этот метод обновляет множественный атрибут одного объекта, а также пройти проверку на основе модели.

 <код> attributes = {:name => "BalaChandar" , :age => 23} obj = Model.find_by_id(params[:id]) obj.update_attributes(attributes)   

Надеюсь, этот ответ будет очищен, когда использовать какой метод активной записи.

 

update_attribute

This method update single attribute of object without invoking model based validation.

obj = Model.find_by_id(params[:id]) obj.update_attribute :language, "java"  

update_attributes

This method update multiple attribute of single object and also pass model based validation.

attributes = {:name => "BalaChandar" , :age => 23} obj = Model.find_by_id(params[:id]) obj.update_attributes(attributes) 

Hope this answer will clear out when to use what method of active record.

</div
 
 
13
 
vote

Также стоит отметить, что с update_attribute нужный атрибут, который будет обновляться, не должен быть белым, перечисленным с <код> attr_accessible , чтобы обновить его в отличие от массового назначения Метод <Код> update_attributes , который будет обновляться только <код> attr_accessible указанных атрибутов.

 

Also worth noting is that with update_attribute, the desired attribute to be updated doesn't need to be white listed with attr_accessible to update it as opposed to the mass assignment method update_attributes which will only update attr_accessible specified attributes.

</div
 
 
8
 
vote

<Код> update_attribute просто обновляет только один атрибут модели, но мы можем передавать несколько атрибутов в <код> update_attribute0 метода.

Пример:

 <код> update_attribute1  

проходит проверку

 <код> update_attribute2  

Это не обновляется, если проверка не удается.

 

update_attribute simply updates only one attribute of a model, but we can pass multiple attributes in update_attributes method.

Example:

user = User.last  #update_attribute user.update_attribute(:status, "active") 

It pass the validation

#update_attributes user.update_attributes(first_name: 'update name', status: "active") 

it doesn't update if validation fails.

</div
 
 
 
 
7
 
vote

Вам может быть заинтересован в посещении этого поста в блоге относительно всех возможных способов назначить запись атрибута или обновления (обновляется до рельсов 4) <Код> update_attribute3 http://www.davidverhasselt.com/set-attribute-in-activerecord/ . Например, он отличается такими аспектами, как управляемые проверки, прикосновение к обновлению объекта_AT или запуск обратных вызовов.

Как ответ на вопрос OP <код> update_attribute4 не передает обратные вызовы.

 

You might be interested in visiting this blog post concerning all the possible ways to assign an attribute or update record (updated to Rails 4) update_attribute, update, update_column, update_columns etc. http://www.davidverhasselt.com/set-attributes-in-activerecord/. For example it differs in aspects such as running validations, touching object's updated_at or triggering callbacks.

As an answer to the OP's question update_attribute does not by pass callbacks.

</div
 
 
 
 
6
 
vote

Отличные ответы. Обратите внимание, что для Ruby 1.9 и выше вы можете (и я думаю) использовать новый синтаксис хеша для update_attributes:

 <код> update_attribute5  
 

Great answers. notice that as for ruby 1.9 and above you could (and i think should) use the new hash syntax for update_attributes:

Model.update_attributes(column1: "data", column2: "data") 
</div
 
 
4
 
vote

. <Код> update_attribute6 и <код> update_attribute7 похожи, но С одной большим разницей: update_attribute8 не пробел проверки.

также:

    .
  • <код> update_attribute9 используется для обновления записи с помощью атрибута Single .

     <Код> update_column0  
  • <Код> update_column1 используется для обновления записи с помощью атрибутов . .

     <Код> update_column2  

Эти два метода действительно легко спутать, учитывая их похожие имена и работы. Поэтому <код> update_column3 удаляется в пользу <код> update_column4 .

Теперь, в Rails4 Вы можете использовать <код> update_column5 на месте <код> update_column6

rel="nofolow noreferrer"> Нажмите здесь , чтобы получить больше информации о <Код> update_column7 ,

 

update_attribute and update_attributes are similar, but with one big difference: update_attribute does not run validations.

Also:

  • update_attribute is used to update record with single attribute.

    Model.update_attribute(:column_name, column_value1) 
  • update_attributes is used to update record with multiple attributes.

    Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...) 

These two methods are really easy to confuse given their similar names and works. Therefore, update_attribute is being removed in favor of update_column.

Now, in Rails4 you can use Model.update_column(:column_name, column_value) at the place of Model.update_attribute(:column_name, column_value)

Click here to get more info about update_column.

</div
 
 
4
 
vote

Чтобы ответить на ваш вопрос, <код> update_attribute пропускает предварительно сохранить "Валидации", но он все еще работает любые другие обратные вызовы, такие как <код> after_save и т. Д. Так, как вы Действительно хочу «просто обновить столбец и пропустить любой AR Cruft», тогда вам нужно использовать (видимо)

<Код> Model.update_all(...) см. https://stackoverflow.com/a/7243777/32453 < / P >.

 

To answer your question, update_attribute skips pre save "validations" but it still runs any other callbacks like after_save etc. So if you really want to "just update the column and skip any AR cruft" then you need to use (apparently)

Model.update_all(...) see https://stackoverflow.com/a/7243777/32453

</div
 
 
2
 
vote

Недавно я столкнулся с <код> update_attribute против <код> update_attributes и выпуск валидации, настолько похожими именами, так что другое поведение, так с толку.

Для того, чтобы пройти хэш к <Код> update_attribute и валидация байпаса Вы можете сделать:

 <код> object = Object.new object.attributes = {   field1: 'value',   field2: 'value2',   field3: 'value3' } object.save!(validate: false)   
 

Recently I ran into update_attribute vs. update_attributes and validation issue, so similar names, so different behavior, so confusing.

In order to pass hash to update_attribute and bypass validation you can do:

object = Object.new object.attributes = {   field1: 'value',   field2: 'value2',   field3: 'value3' } object.save!(validate: false) 
</div
 
 
1
 
vote

Я думаю, что ваш вопрос в том, если имел обновление_attribute в quot_save, приведет к бесконечному циклическому циклическому циклам (обновления_атрибата вызовов FORE_SAVE, изначально срабатываемые на вызове update_attribute)

Я уверен, что он обойдит обратный вызов FORE_SAVE, так как он на самом деле не сохраняет запись. Вы также можете сохранить запись без запуска проверки, используя

model.save false

 

I think your question is if having an update_attribute in a before_save will lead to and endless loop (of update_attribute calls in before_save callbacks, originally triggered by an update_attribute call)

I'm pretty sure it does bypass the before_save callback since it doesn't actually save the record. You can also save a record without triggering validations by using

Model.save false

</div
 
 

Связанный проблема

23  Почему не приятно иметь первичный ключ на таблице присоединения?  ( Why is it not good to have a primary key on a join table ) 
Я смотрел на скринкаст, где автор сказал, что нехорошо, чтобы иметь первичный ключ на таблице присоединения, но не объяснил, почему. Таблица соединения в пр...

2  Можно #to_s когда-либо неудачу?  ( Can to s ever fail ) 
Я строю простую фабрику в Ruby, который возвращает <код> Callable (<код> Lambda в этом случае), который знает, как отличить имя прошедшего типа (например, к...

0  Ошибка обновления записи  ( Error updating a record ) 
Я получаю ошибку mysql: #update (ActiveReCord :: authentInvalid) "mysql :: Ошибка: # hy 000got Ошибка 139 из механизма хранения: При попытке обновить те...

1  Включая метод помощника в тесте контроллера  ( Including helper method in controller test ) 
Как мне включить некоторого помощника в мой код ControlLer_Spec? У меня есть метод под названием «A_TITLE (ADS)» в Dates_ads_Helper и возвращает себя. Как исп...

0  Rails find_by_sql Не возвращая результаты  ( Rails find by sql not returning results ) 
Так что мой запрос, который я бегу, возвращает массив с идентификатором и ничего больше. Но когда я бегу один и тот же запрос в PSQL, он возвращает правильные...

6  Модели Activerecord кэшированы в заставленных граблях?  ( Activerecord models cached in rake tasks ) 
Я знаю, что в Rails 2.3.2 QuickeRecord запросы кэшированы, то есть вы можете увидеть что-то в журнале разработки / производства: <код> CACHE (0.0ms) SELEC...

0  Ruby On Rails - Включение клиента скачать видео  ( Ruby on rails enabling client to download videos ) 
Требование - у меня есть видео, размещенное на моем сервере, пользователь должен быть в состоянии загрузить файл, нажав на ссылку. Я следую инструкциям, при...

3  Подавить ошибку при сохранении записи в рельсах  ( Suppress an error when saving a record in rails ) 
Я сохраняю данные в таблицу. <код> Question title:string author_id:integer description:text upvotes:integer Если значение «question.upvotes» сос...

1  Rails link_to запрос params - выбор в элементе на следующей странице  ( Rails link to query params selecting in item on the next page ) 
прямо сейчас у меня <код> link_to . Похоже на кнопку пользователю. Это кнопка обновления, поэтому он направляет пользователь на страницу планов. Я не только...

10  Какой правильный способ запуска одного контроллера действия от другого действия контроллера без перенаправления HTTP?  ( Whats the correct way to run one controller action from another controller acti ) 
Я хотел бы иметь возможность отправлять из одного контроллера на другой условно, на основе комбинации параметров запросов и данных в базе данных. Что я имею...

4  JSON и CARIONWAVE IPHONE проблема [закрыто]  ( Json and carrierwave iphone problem ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

11  Используйте PaperClip для сохранения изображений Base64, полученные из API  ( Use paperclip for saving base64 images obtained from an api ) 
У меня есть фото модель с атрибутом изображения. Изображение содержит строку Base64, полученную из API. Мне нужно запустить обратный вызов после_create, и я д...

1  Логические ценности не "читают" в рельсах  ( Boolean values not being read in rails ) 
Я импортировал некоторые значения из Excel, используя ROO на логические поля в моем приложении Rails. В консоль рельсов Похоже, что все работает нормально, ...

3  Разделите данные сеанса между сайтами?  ( Share session data between sites ) 
Я работаю над многосемы, и я хотел бы разделить данные сеанса между двумя или более сайтами. У меня есть идентификатор сеанса, но какой лучший способ получить...

0  Маршрутизация поддоменов в рельсах и главном участке  ( Subdomain routing in rails and main site ) 
Я пытаюсь установить следующее: www.domain.com идет на главный сайт (пользователь может зарегистрироваться, информацию о приложении) foo.domain.com отправ...

Связанный проблема

23  Почему не приятно иметь первичный ключ на таблице присоединения? 
2  Можно #to_s когда-либо неудачу? 
0  Ошибка обновления записи 
1  Включая метод помощника в тесте контроллера 
0  Rails find_by_sql Не возвращая результаты 
6  Модели Activerecord кэшированы в заставленных граблях? 
0  Ruby On Rails - Включение клиента скачать видео 
3  Подавить ошибку при сохранении записи в рельсах 
1  Rails link_to запрос params - выбор в элементе на следующей странице 
10  Какой правильный способ запуска одного контроллера действия от другого действия контроллера без перенаправления HTTP? 
4  JSON и CARIONWAVE IPHONE проблема [закрыто] 
11  Используйте PaperClip для сохранения изображений Base64, полученные из API 
1  Логические ценности не "читают" в рельсах 
3  Разделите данные сеанса между сайтами? 
0  Маршрутизация поддоменов в рельсах и главном участке 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.