Миграция рельсов дает nometoderror, и я не понимаю, почему

#ruby-on-rails

Вопрос:

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

 ==  AddStorecreditGizmoType: migrating ========================================
rake aborted!
NoMethodError: undefined method `find_by_name' for GizmoCategory(id: integer, description: string):Class
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/base.rb:1876:in `method_missing'
/home/thefonso/site-dev/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:175:in `method_missing_with_paginate'
db/migrate//20090628000954_add_storecredit_gizmo_type.rb:4:in `up'
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/migration.rb:282:in `block in migrate'
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/migration.rb:282:in `migrate'
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/migration.rb:365:in `migrate'
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/migration.rb:457:in `run'
/var/lib/gems/1.9.1/gems/activerecord-2.3.14/lib/active_record/migration.rb:409:in `run'
/var/lib/gems/1.9.1/gems/rails-2.3.14/lib/tasks/databases.rake:135:in `block (3 levels) in <top (required)>'
/var/lib/gems/1.9.1/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:migrate:up
(See full trace by running task with --trace)
 

Вот код файла миграции

 class AddStorecreditGizmoType < ActiveRecord::Migration
  def self.up
    # TODO: GizmoCategory.find_by_name("misc") is breaking...why? Attempted to replace with "where" but same error.
    new = GizmoType.new(:name => "store_credit", :description => "Store Credit", :gizmo_category => GizmoCategory.find_by_name("misc"), :required_fee_cents => 0, :suggested_fee_cents => 0)
    new.save!
    DB.execute("UPDATE gizmo_contexts_gizmo_types SET gizmo_type_id = #{new.id} WHERE gizmo_type_id IN (SELECT id FROM gizmo_types WHERE name = 'gift_cert');")
  end

  def self.down
    DB.execute("UPDATE gizmo_contexts_gizmo_types SET gizmo_type_id = (SELECT id FROM gizmo_types WHERE name = 'gift_cert') WHERE gizmo_type_id IN (SELECT id FROM gizmo_types WHERE name = 'store_credit');")
    GizmoType.find_by_name("store_credit").destroy
  end
end

 

Я пробовал использовать «где» и «Find_by», но я продолжаю получать один и тот же «неопределенный метод бла-бла-бла для GizmoCategory

Можете ли вы указать мне правильное направление? Что я упускаю? забыл? Что здесь происходит?

О, и версии следующие

  • рельсы — 2.3.14
  • рубин — 1.9.3p194

Спасибо

Ответ №1:

Эти find_by_* методы не существовали в activerecord 2.3.14. Используйте Model.find вместо этого.

 category = GizmoCategory.find(:first, conditions: "name = 'store_credit'")
category.destroy if category
 

Комментарии:

1. так что бы этот раздел «:gizmo_category => GizmoCategory.find_by_name(«разное») » стал «:gizmo_category =>> GizmoCategory.find(:первый, «разное»)»,»???

2. GizmoCategory.find(:first, conditions: "name = 'misc'")

3. ну, это дало мне новую ошибку «ActiveRecord::StatementInvalid: PG::Неопределенный столбец: ОШИБКА: столбец «имя» не существует» . И в базе данных я вижу столбец имени под моделью «gizmo_types». ОБНОВЛЕНИЕ: Я вижу некоторую проблему…Я перестраиваю это приложение из существующего приложения, и я вижу в ЭТОМ другом приложении, давайте назовем его app PRIME. На prime модель «gizmo_categories» имеет столбец «имя». Так что теперь нужно выяснить, почему этой колонки нет в перестроенном приложении разработчика.

4. ОБНОВЛЕНИЕ: поэтому я написал еще одну миграцию, чтобы создать столбец отсутствующего имени, а затем повторно выполнил эту миграцию с изменениями . найдите, как упоминалось выше. Это сработало, поэтому перечислите это как решение