2014-10-16 5 views
0

У меня есть Parent, у кого много Children, но только один Firstborn. Firstborn - это Child со связанным ChildType «первенцем».Rails 4: Parent has_one Ребенок с определенным родственным ChildType

class Parent 
    has_many :children 
    has_one :firstborn, -> { includes(:child_type).references(:child_type).where("child_type.name = ?", "firstborn") }, class_name: "Child" 
end 

class Child 
    belongs_to :parent 
    belongs_to :child_type 
end 

class ChildType 
    has_many :children 
end 

Следующий код делает не работы:

parent = Parent.find(1)  # => <parent object> 
firstborn = parent.firstborn # => nil 

Конечной целью является возможность получения всех родителей и первенец детей в 1 запрос.

parents_and_firstborn = Parent.includes(:firstborn) 

Я ищу решение, которое выполняет только 1 запрос и извлекает Parent и связанных с ними Firstborn детей.

Я просмотрел документы Rails 4.0.2 API около has_one, но ни один из их примеров не разбит на несколько таблиц, как то, что я пытаюсь сделать.

Обновление: 2014-10-16 14:40

Следующая "работает", но я не знаю, почему:

parent = Parent.includes(:firstborn).find(1) # => <parent with firstborn>

Почему я не могу извлечь firstborn ПОСЛЕ Я получил Parent, но если я includes(...) в исходном запросе, он возвращает его?

Решение: 2014-10-16 14:50

У меня был attr_accessor :firstborn все еще застряли в Parent модели от предыдущих попыток, как решить эту проблему. Когда я удалил этот неиспользуемый код, код has_one :firstborn ... работал должным образом.

ответ

1

Это выглядит правильно (ish) как есть, вы должны отлаживать выполняемый SQL.

Я действительно сомневаюсь в достоинствах таблицы ChildType из того, что я вижу здесь. Ваша схема кажется слишком сложной. Почему вы не используете first_born bool?

+0

Я хотел бы использовать альтернативный дизайн схемы ... однако, я работаю с унаследованной системой, и у меня нет возможности изменить ее. Поверьте мне, я пробовал несколько месяцев из-за этой проблемы и многих, многих других. Для конкретной проблемы будет несколько типов ChildTypes, которые могут потребоваться для запроса/фильтрации. –

+0

Если вы показываете SQL, возвращаемый в обоих случаях; нам может быть повезло, что вы сможете отлаживать. –

+0

Ох ... Я нашел проблему. Теперь я чувствую себя глупо! Пока я работал над этой проблемой, я создал «attr_accessor: firstborn», прежде чем решил пойти с ассоциацией «has_one». Этот метод доступа был тем, что возвращало 'nil'. Как только я удалил это, приведенный выше код действительно работал должным образом. Я ненавижу устаревшие системы! –