#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. ОБНОВЛЕНИЕ: поэтому я написал еще одну миграцию, чтобы создать столбец отсутствующего имени, а затем повторно выполнил эту миграцию с изменениями . найдите, как упоминалось выше. Это сработало, поэтому перечислите это как решение