Rails: Как я могу назвать `self.save` в моей модели и сохранить его в базе данных? - PullRequest
12 голосов
/ 28 октября 2010

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

В моем контроллере:

@article.perform_some_calulcations!

В моей модели:

def perform_some_calculations!
  self.foo.gsub!(/regexp/, 'string')
  self.save
end

Если я добавлю debugger операторов в мой метод и после моего вызова его в контроллере, @article.foo будет иметь правильное значение. Однако, когда я продолжаю, он не сохраняется в базе данных, и webrick не сообщает о каких-либо UPDATE заявлениях.

Что не так? Я не знаю, приходилось ли мне когда-либо делать это раньше, но, конечно, это возможно, верно?

Ответы [ 2 ]

18 голосов
/ 28 октября 2010

Ваша проблема заключалась в том, что если вы измените атрибут «на месте», это означает: без присвоения ему нового значения, Rails будет думать, что нет ничего нового для сохранения, поэтому он «оптимизирует» сохранение. 1001 *

Каждый аксессор записи вашего атрибута будет устанавливать флаг, поэтому метод save будет знать, что он должен проверить, действительно ли текущее значение отличается от значения, считанного из базы данных. Вот почему self.foo = self.foo.gsub(/regexp/, 'string') работает (обратите внимание, что восклицательный знак здесь не нужен) .

Если вам нужно изменить атрибут «на месте», например, с помощью gsub! или replace, используйте:

def perform_some_calculations!
  foo_will_change!
  self.foo.gsub!(/regexp/, 'string')
  self.save
end
2 голосов
/ 28 октября 2010

Ваши атрибуты могут быть защищены. Проверьте свой журнал. Если это так, то

self.save! 

или

self.save(false)

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


self.foo = self.foo.gsub!(/regexp/, 'string')
...