3

Скажем, у меня есть следующие модели:Как найти родителя ребенка через ассоциацию has_one в Rails3?

class Parent < ActiveRecord::Base 
    has_one :child 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Я хотел бы retrive родителей через ребенка, но выполнив следующие действия терпит неудачу: я нахожу модель следующим образом через контроллер

@child = Child.find(params[:child_id]) 

(не уверен, если это уместно, но так как я использую неглубокую маршрутизации, то parent_id не доступен в URL)

на мой взгляд, я хотел бы получить родитель ребенка, как это:

@child.parent 

Как я могу это сделать?

Спасибо!


Обновление: мой пример (когда я решил создать новое приложение и создать его), действительно работал отлично. В моем фактическом приложении я забыл включить belongs_to :parent в модель ребенка. Как глупо со мной. Спасибо, что нашли время, чтобы прокомментировать и ответить, ребята. В следующий раз я посмотрю более внимательно, прежде чем размещать здесь вопрос.

+1

'@ child.parent' должен работать; в чем проблема? – Zabba

+0

проблема в том, что я недостаточно пристально смотрю. См. Обновление. –

ответ

9

Это именно то, как вы это делаете.

Тот факт, что он не работает, указывает на то, что существует некоторая основная проблема, препятствующая тому, что у родителя есть @child.

Прежде всего, убедитесь, что в таблице для Child есть внешний ключ. Столбец внешнего ключа (в данном случае parent_id) всегда должен находиться на модели с ассоциацией belongs_to.

Во-вторых, убедитесь, что у ребенка, которого вы выбираете, есть родитель. Это означает, что внешний ключ (parent_id) не должен быть равен нулю. Если оно имеет числовое значение, проверьте, что таблица для Parent имеет запись с тем же значением, что и foreign_key, в Child.

Вы также можете использовать консоль Rails (rails console из вашего каталога приложений), чтобы дважды проверить ассоциации. Сделайте Child.first.parent и посмотрите, что происходит. Конечно, вы можете начать использовать такие варианты, как Parent.first.child или Child.find(123).parent, но вы не можете использовать params.

 Смежные вопросы

  • Нет связанных вопросов^_^