Rails ActiveRecord update_attributes!не работает - PullRequest
1 голос
/ 11 января 2011

Мои используемые envs перечислены ниже:

Mysql: 5.1.51-community MySQL Community Server
Rails: 2.3.5
Ruby: 1.8.7

Есть одна запись, которую я получил, это элемент, затем я использовал приведенный ниже код для обновления атрибутов,

item.update_attributes!(
  :a => a,
  :b => b,
  :c => c
)

для всех этихтолько в обновленных атрибутах поле изменяет значение, значения других атрибутов остаются неизменными, но я не знаю, какие атрибуты изменены, поэтому я обновил все атрибуты.

Во время процесса отладки я обнаружил, что поле изменяет значение, и оно отличается от значения элемента записи, но обновление не оказывает никакого влияния.

Кто-нибудь может мне помочь?спасибо.

Добавлено:

Только сейчас я прослеживаю код rails и обнаружил, что проблема связана с кодом rails здесь:

    def update(attribute_names = @attributes.keys)
      quoted_attributes = attributes_with_quotes(false, false, attribute_names)
      return 0 if quoted_attributes.empty?
      connection.update(
        "UPDATE #{self.class.quoted_table_name} " +
        "SET #{quoted_comma_pair_list(connection, quoted_attributes)} " +
        "WHERE #{connection.quote_column_name(self.class.primary_key)} =     #{quote_value(id)}",
      "#{self.class.name} Update"
     )
   end

, если я изменилустановите значение в db пустым, тогда attribute_names - это массив, содержащий поле a, но поле value в db не пустое, attribute_names - пустой массив, но @attributes - это всегда карта, содержащая a, b и c.растерян, увидев код рельсов.

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Извините, в вопросе недостаточно информации для продолжения, так что это всего лишь предположение:

Есть ли шанс, что вы используете attr_accessible или attr_protected с этой моделью?

Использование attr_accessible и оно не включает b и c, или attr_protected и включает b и c, чтобы объяснить поведение, которое вы видите.

Если это таквам придется сделать несколько update_attribute!вызовов.

0 голосов
/ 11 января 2011

Я нашел причину, так как метод для изменения значения поля имеет ошибки, после изменения его первоначальное и новое значение совпадают, поэтому AR не выполняет действие обновления, так как нет никакого измененного поля.

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