возможная ошибка 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