Новое приложение Rails извлекает некоторые данные из устаревших таблиц

#ruby-on-rails-3 #legacy-database

#ruby-on-rails-3 #устаревшая база данных

Вопрос:

У меня есть новое приложение rails, которому необходимо получить доступ к данным из устаревшей таблицы с именем «Doo_dad», с автоматически вводимым первичным ключом с именем «id» и строковым полем с именем «name».

Итак, я создал новый файл модели с именем app/models/doodad.rb, который выглядит следующим образом:

 class Doodad < ActiveRecord::Base
   set_table_name "Doo_dad"
end
  

Когда я загружал консоль Rails, я мог получить доступ к своим моделям, созданным Rails, но я не мог видеть класс

 > rails console
irb> Doodad.class
NameError: uninitialized constant Doodad
(from (irb):1: in `evaluate`
  

Класс Doodad в app/models/doodad.rb не загружался. Этот код хорош, потому что, когда я сделал следующее:

 > rails console
irb> class Doodad < ActiveRecord::Base
irb> set_table_name "Doo_dad"
irb> end
irb> Doodad.class
 => OK
irb> d=Doodad.new
irb> d.name="Uno"
irb> d.save
 => OK no errors
  

т.Е. Когда я исправил содержимое app /models/doodad.rb, все было в порядке, и Doodad с именем «Uno» был сохранен в базе данных.

Как я могу заставить Rails загружать мои классы моделей, которые подключаются к устаревшим таблицам?

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

1. Какие ошибки? Такие вещи, как «что происходит», часто являются полезным диагностическим инструментом.

2. Отображается ли таблица в schema.rb ?

3. Ошибка имени: неинициализированная константа

4. Схемы нет в schema.rb, но я бы не ожидал этого, потому что я не создавал для нее миграцию. И, насколько я могу судить, schema.rb не содержит ни одного символа, определенного ни в одном из классов моделей.

Ответ №1:

Ого! У меня был класс в app/models/doodads.rb. Как только я переименовал его в app/models/doodad.rb, все было в порядке.

Я предполагаю, что соглашение об одном классе модели для каждого файла с соглашением об именовании файлов модели Rails (filename=classname.underscore «.rb») является абсолютным «обязательным», чтобы заставить это работать.