2015-10-27 2 views
1

У меня есть две модели в моем приложении Rails:Неопределенный метод Create для AR модели Отношения

class Student < ActiveRecord::Base 
    belongs_to :higher_education 
    attr_accessible :higher_education_id 
end 

class HigherEducation < ActiveRecord::Base 
    has_many :students 
end 

Сначала я выполнить следующую команду:

he = HigherEducation.create() 

(0.0ms) begin transaction                              
    SQL (56.4ms) INSERT INTO "higher_education" ("created_at", "text", "updated_at") VALUES (?, ?, ?) [["created_at", Tue, 27 Oct 2015 04:22:14 UTC +00:0│ 
0], ["text", "baz"], ["updated_at", Tue, 27 Oct 2015 04:22:14 UTC +00:00]]                  │ 
    (10.3ms) commit transaction                             
=> #<HigherEducation id: 3, text: "baz", created_at: "2015-10-27 04:22:14", updated_at: "2015-10-27 04:22:14"> 

Далее я выполнить другую команду и получить ошибку :

he.students.create() 
=> nil 

Я возвращаюсь NoMethodError: undefined method create for nil:NilClass.

Любая идея, в чем проблема?

+0

Можете ли вы изменить свой вопрос, чтобы сделать следующее: Откройте консоль консоли Rails и пройдите через эти точные шаги? Я подозреваю, что между этими двумя шагами происходит что-то еще. –

+0

В частности, вы _sure_, что 'он' создается? Или это не удается создать на основе ошибок проверки? –

+0

А потом сразу после этого ... he.students.create()? Можете ли вы показать всю эту транзакцию? –

ответ

0

Удалить attr_accessible :higher_education_id.

Rails считывает схему базы данных (а не schema.rb, но фактические таблицы) при запуске и создает сеттеры и геттеры для столбцов в вашей базе данных.

позволяет сказать, что ваша таблица выглядит следующим образом:

students 
    - id [Int, Index, primary key] 
    - email [Varchar] 
    - higher_education_id [Int, Index, Foreign Key] 

Ваши экземпляры Student будет уже отвечать на .email, .email=, .higher_education_id, .higher_education_id= ...

Кроме того, когда вы устанавливаете отношения в вашей модели Рельсы будут перезаписывать эти сеттеры и геттеры, чтобы они также настраивали связанный объект.

Единственный момент, когда вы должны использовать attr_accessible в моделях ActiveRecord, - это когда вы хотите использовать «виртуальный атрибут», который не поддерживается столбцом базы данных.

+0

Я предполагаю, что вы получаете неожиданное поведение, потому что таблица ваших учеников на самом деле не имеет столбца «high_education_id». 'attr_accessible' маскирует ошибку, и вместо этого отношение просто сохраняется в ничто. – max