Хобрук: Ваш путь к мастерству в программировании

NoMethodError: неопределенный тип метода для #‹Class›

У меня есть столбец с именем type_name в таблице для БД Oracle 12c, всякий раз, когда я пытаюсь добавить запись с помощью консоли Rails, я получаю сообщение ниже. Должен ли я изменить имя столбца с type_name на любое другое имя, чтобы решить эту проблему?

Модель:

class LicenseTypes < ActiveRecord::Base

  validates :name, :type, presence: true

  def as_json(options = {})
    {
      id: id,
      name: name,
      description: description,
      type_name: type_name
    }
  end
end

Миграция:

class CreateLicenseTypes < ActiveRecord::Migration
  def change
    create_table :license_types do |t|
      t.string :name
      t.string :type_name
      t.string :description
      t.integer :created_at
      t.integer :updated_at
    end
  end
end

Код:

LicenseType.create({name: "Car Lic" , type_name: "Car"})

Ошибка:

NoMethodError: undefined method `type' for #<LicenseType:0x76b49d0>
        from org/jruby/RubyBasicObject.java:1633:in `method_missing'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activemodel-4.2.7/lib/active_model/attribute_methods.rb:433:in `method_missing'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activemodel-4.2.7/lib/active_model/validator.rb:149:in `block in validate'
        from org/jruby/RubyArray.java:1734:in `each'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activemodel-4.2.7/lib/active_model/validator.rb:148:in `validate'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activerecord-4.2.7/lib/active_record/validations/presence.rb:5:in `validate'
        from org/jruby/RubyKernel.java:1808:in `public_send'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:455:in `block in make_lambda'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:192:in `block in simple'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:504:in `block in call'
        from org/jruby/RubyArray.java:1734:in `each'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:504:in `call'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activesupport-4.2.7/lib/active_support/callbacks.rb:778:in `_run_validate_callbacks'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activemodel-4.2.7/lib/active_model/validations.rb:399:in `run_validations!'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activemodel-4.2.7/lib/active_model/validations/callbacks.rb:113:in `block in run_validations!'
... 15 levels...
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activerecord-4.2.7/lib/active_record/transactions.rb:286:in `block in save'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activerecord-4.2.7/lib/active_record/transactions.rb:301:in `rollback_active_record_state!'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activerecord-4.2.7/lib/active_record/transactions.rb:285:in `save'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/activerecord-4.2.7/lib/active_record/persistence.rb:34:in `create'
        from (irb):12:in `<eval>'
        from org/jruby/RubyKernel.java:995:in `eval'
        from org/jruby/RubyKernel.java:1296:in `loop'
        from org/jruby/RubyKernel.java:1115:in `catch'
        from org/jruby/RubyKernel.java:1115:in `catch'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/railties-4.2.7/lib/rails/commands/console.rb:110:in `start'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/railties-4.2.7/lib/rails/commands/console.rb:9:in `start'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/railties-4.2.7/lib/rails/commands/commands_tasks.rb:68:in `console'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/railties-4.2.7/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from C:/jruby-9.1.5.0/lib/ruby/gems/shared/gems/railties-4.2.7/lib/rails/commands.rb:17:in `<main>'
        from org/jruby/RubyKernel.java:956:in `require'
        from bin/rails:4:in `<main>'

  • Можете ли вы опубликовать код вашей модели LicenseType? 16.03.2017
  • Вообще говоря, называть столбец type опасно в Rails... это одно из неписаных часто используемых имен для STI (и других подобных вещей). Лучше переименовать. Кроме того: name против type_name не являются строго описательными именами, которые помогают новому разработчику мгновенно определить, для чего используются столбцы... переименование также хорошо подходит для этой цели :) 16.03.2017
  • @GokulM Я добавил модель. 16.03.2017
  • @Shiko Вы добавили файл миграции, а не код модели. 16.03.2017
  • @GokulM Большое спасибо, теперь я обнаружил свою проблему. Я забыл тип столбца в валидации 16.03.2017

Ответы:


1

Измените type на type_name, так как тип можно использовать только для STI.

validates :name, :type, presence: true

to

validates :name, :type_name, presence: true

16.03.2017
  • Обнаружил мою проблему, когда вы спросили модель. Большое спасибо 16.03.2017
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..