2015-07-29 2 views
1

У меня есть 4 модели: Patient, Admin, Doctor, User. Patient, Admin и Doctor распространяется User.undefined метод при доступе к атрибутам модели (STI)

// patient.rb 
class Patient < User 
end 

// doctor.rb 
class Doctor < User 
end 

// admin.rb 
class Admin < User 
end 

Однако я не могу получить атрибуты, специфичные для дочернего класса. Когда я звоню, например patient.fathername, он дает мне ошибку

NoMethodError: неопределенный метод `«для Отчество #Patient: 0x007fa4c172a188

в то время как у меня есть fathername столбец в моей Patient модели.

//schema.rb 
create_table "patients", force: :cascade do |t| 
t.string "fathername" 
end 

Проведено некоторое исследование проблемы, и понял, что другие люди, которые используют ИППП, также столкнулись с этой проблемой. Однако я не мог понять ни одно из решений и источник проблемы. Что не так с ИППП и получением атрибутов?

+0

Что такое STI? Вы создали миграцию для создания таблицы «родители», или вы просто отредактировали «schema.rb»? – eirikir

+0

@eirikir Я правильно создал все модели и дал колонку ** type **, чтобы указать ее тип. STI - одностраничное наследование. –

ответ

1

Вы должны добавить поле к Отчество модели пользователя, потому что это один, который наследует от ActiveRecord :: Base

STI работает только с одной таблицей (в данном случае пользователей) и добавляет поле с именем «Тип» который сохраняет имя модели, которая сохраняет запись, она сохраняет «Пациент» для записей пациентов, «Доктор» для записей врачей и т. д. все в одной и той же таблице «Пользователи».

http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

Я надеюсь, что это помогает.

+0

Я правильно создал свои модели. Модель My User имеет столбец типа, который указывает тип: Patient, Doctor и Admin. Однако я не могу получить доступ к столбцам модели пациента. –

+0

Я расширю свой ответ, вам нужно создать поле имени отца в таблице Users, STI использует ту же таблицу для всех моделей. – neydroid