2011-01-07 3 views
1

У меня здесь запутанная проблема. У меня две модели с отношением has_one. У меня есть форма, которая использует fields_for для создания дочернего экземпляра. Однако, когда я пытаюсь получить доступ к родительскому элементу из дочерней модели, он получает только нуль.Невозможно получить доступ к родительскому процессу ребенка через has_one

Я попытался дать краткий и простой пример вопроса ниже:

class Parent 
    has_one :child 
    accepts_nested_attributes_for :child 
    attr_accessible :child_attributes 
end 

class Child 
    belongs_to :parent 
    validate :parent_is_called_mum 

    def parent_is_called_mum 
    parent.name.equals?("mum") 
    end 
end 

Проблема заключается в том, что parent.name.equals?("mum") возвращает ошибку:

You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.name 

Почему отношения возвращаются как ноль?

+0

Сверху моей головы, следует ли «родитель» капитализироваться как «Родитель»? –

+0

Я думаю, что это было бы на уровне класса, и я хочу получить доступ к экземпляру этого класса, связанного с дочерним. – amaseuk

+0

Ах, да, я думаю, вы правы. =) –

ответ

1

Я не уверен, но попробуйте с self.parent.name.equals?("mum")

себе может быть неявным, так что это не может быть ваше решение.

EDIT: В вашей базе данных, вы убедитесь, что столбец parent_id в childs таблице не равно нулю? Если это так, то нормально, что self.parent возвращает null. Нил, я имею в виду.

+0

нет разницы к сожалению – amaseuk

+0

он не установлен в NOT NULL - действительно ли это имеет значение? – amaseuk

+0

Кстати, я удалил строку attr_accessible: child_attributes, и она работает - неправильный синтаксис? – amaseuk

1

Попробуйте добавить атрибут inverse_of на каждой стороне ассоциации:

на модели Родитель:

has_one :child, :inverse_of => :parent 

на модели ребенка:

belongs_to :parent, :inverse_of => :child 

Здесь, искать «Двунаправленные отношения»: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Надеюсь, что это поможет!