У меня есть 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 ...
работал должным образом.
Я хотел бы использовать альтернативный дизайн схемы ... однако, я работаю с унаследованной системой, и у меня нет возможности изменить ее. Поверьте мне, я пробовал несколько месяцев из-за этой проблемы и многих, многих других. Для конкретной проблемы будет несколько типов ChildTypes, которые могут потребоваться для запроса/фильтрации. –
Если вы показываете SQL, возвращаемый в обоих случаях; нам может быть повезло, что вы сможете отлаживать. –
Ох ... Я нашел проблему. Теперь я чувствую себя глупо! Пока я работал над этой проблемой, я создал «attr_accessor: firstborn», прежде чем решил пойти с ассоциацией «has_one». Этот метод доступа был тем, что возвращало 'nil'. Как только я удалил это, приведенный выше код действительно работал должным образом. Я ненавижу устаревшие системы! –