Где правильное место, чтобы положить _changed? методы в Rails? - PullRequest
1 голос
/ 21 декабря 2009

У меня есть пользовательская модель, которая проверяет, изменилось ли значение before_save (запустив User.zipcode_changed?). Идея состоит в том, что это поставит в очередь отложенное задание, если оно имеет.

Проблема в том, что при переносе приложения с нуля появляется ошибка:

An error has occurred, all later migrations canceled:

undefined method `postcode_changed?' for #<User:0x105db6158>

Следовательно, где я должен положить их? Модель не в том месте?

Ответы [ 3 ]

6 голосов
/ 21 декабря 2009

Когда вы извлекаете новый проект с нуля, вы не должны использовать миграции для создания базы данных. Вы должны использовать rake db:schema:load вместо.

Позвольте мне показать вам, почему.

Предположим, вы создали новую модель Post с таблицей публикаций по миграции 10. При миграции 11 вы выполняете некоторые специальные разработки для модели Post. Через некоторое время вы решаете удалить модель Post и таблицу сообщений, поскольку она больше не требуется.

Шесть месяцев спустя вы оформляете проект с нуля. Если вы попытаетесь запустить rake db:migrate, миграция 11 потерпит неудачу с жалобой на отсутствующую модель. Это правда, модель была удалена много месяцев назад, и она больше не доступна.

Вместо этого, если вы запустите rake db:schema:load, вы инициализируете базу данных с правильной версией схемы.

Говоря о миграциях, если вы только что создали метод почтового индекса и пытаетесь использовать _changed? Волшебный метод в той же миграции, вам необходимо перезагрузить схему раньше.

class MigrationFile < ...
  self.up
    add_column :user, :postcode, :string

    User.all.each { |user| puts user.postcode_changed? }  # will fail 

    User.reset_column_information
    User.all.each { |user| puts user.postcode_changed? }  # now it works
  end
  ...
end
1 голос
/ 21 декабря 2009

Вы говорите, что оба zipcode_changed? и почтовый индекс изменился? в вашем вопросе. Какое реальное имя столбца в вашей базе данных - почтовый индекс или почтовый индекс? ActiveRecord будет создавать только _changed? удобный метод для фактического имени столбца.

0 голосов
/ 28 декабря 2009

То, что вы делаете, это разумный код модели, но не очень хороший при миграции.

Использование кода модели в ваших миграциях проблематично из-за подобных проблем. Я рекомендую придерживаться SQL-ориентированного кода.

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