невозможно обновить атрибут с помощью ActiveRecord - PullRequest
2 голосов
/ 15 ноября 2011

Я хочу поменять содержимое в таблице answers с ActiveRecord.
код 1:

Archieve::Answer.find_each do |answer|
  str = answer.content
  dosomething() #change the value
  answer.update_attribute(:content,str)
end

Но это не меняет значение содержимого.

код 2:

Archieve::Answer.find_each do |answer|
  str = answer.content
  dosomething() #change the value
  answer.reload
  answer.update_attributes(
    :content => str
  )
end

Перед обновлением атрибутов :content я reload записываю каждый раз.
Это действительно может изменить значение.
Почему?
В чем разница между code 1 & code 2?
Исходный код

###1 Post Debug Message:
Updated Post:

Changed?: false 
valid?: true 
errors: #<ActiveModel::Errors:0xa687568> 
errors: #<ActiveModel::Errors:0xa687568 @base=#<Archieve::Answer id: 9997190932758339, user_id: 4163690810052834, question_id: 3393286738785869, content: "狗狗生病,好可怜呀,", is_correct: false, votes_count: 0, comments_count: 0, created_at: "2011-11-06 18:38:53", updated_at: "2011-11-06 18:38:53">, @messages={}>

1 Ответ

0 голосов
/ 15 ноября 2011

возможная ошибка ActiveRecord 3.1.1

ОП упомянул мне, что он использует require "active_record" в автономном скрипте (без использования rails runner).Для его решения нет отдельного приложения на Rails, он просто использует скрипт.Это не обязательно плохо, и работало в более ранних версиях ActiveRecord, например, 2.x AFAIK - может быть, это регрессия в Rails 3.1 из-за новой зависимости?

# the OP's require statements:
require 'rubygems'
require 'logger'
require 'yaml'
require 'uuidtools'
require 'active_record'

полный код здесь: https://raw.github.com/Zhengquan/Swap_Chars/master/lib/orm.rb

может быть, отсутствует зависимость, или проблема с AR 3.1.1 при автономной инициализации?

Этоэто может быть ошибка на самом деле

Возможно, update_attribute() вызывает ошибку в грязном отслеживании атрибутов, которая затем неверно предполагает, что объект не изменился, и в результате этого он не будетбыть настойчивым, хотя реализация update_attribute() вызывает save() (см. фрагмент кода ниже).

Я видел нечто подобное с более старой версией Mongoid - может быть, что есть подобный скрытыйошибка в вашей версии ActiveRecord для update_attribute()

В консоль Rails monkey-patch update_attribute, как это:

class ActiveRecord::Base
  def update_attribute(name, value) # make sure you use the exact code of your Rails Version here
    send(name.to_s + '=', value)
    puts "Changed?: #{changed?}"        # this produced false in the OP's scenario
    puts "valid?: #{valid?}"
    puts "errors: #{errors.inspect}"
    save
  end
end

, затем попробуйте снова запустить код 1...

вы не должны видеть «Changed ?: false» .. если он возвращает false, хотя вы изменили атрибут, то в вашей версии ActiveRecord есть ошибка, и вы должны сообщить об этом.

Код 1:

NПРИМЕЧАНИЕ: проверьте определение update_attribute () (в единственном числе) здесь: (пожалуйста, прочитайте мелкий шрифт относительно проверок - использование этого метода не очень хорошая идея)

http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000400

См. Также:

Rails: update_attribute vs update_attributes

Исходный код для update_attribute () выглядит следующим образом:

2260:       def update_attribute(name, value)
2261:         send(name.to_s + '=', value)
2262:         save
2263:       end

может произойти сбой, если есть ошибка с грязным отслеживанием атрибутов ...

Код 2:

Второй код выглядит правильно.

Есть несколько вещей, которые следует учитывать:

1) какие атрибуты вы определили как доступные через attr_accessible?

например, только доступные атрибуты будут обновляться через update_attributes ()

http://apidock.com/rails/ActiveRecord/Base/update_attributes

2) какие проверки вы используете?

вы уверены, чтопроверки проходят для записи при вызове update_attribute?

См. также:

http://guides.rubyonrails.org/active_record_querying.html

http://m.onkey.org/active-record-query-interface

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...