«Найти» «родительский» объект во вложенных ресурсных отношениях?
-
22-07-2019 - |
Вопрос
Скажите, что у меня есть два ресурса, Project и Task. Проект может иметь много задач; Задача принадлежит одному проекту. Также скажите, что у меня есть Задача, вложенная в Project в Routs.rb:
map.resources :projects do |project|
project.resources :tasks
end
Можно ли программно обнаружить эти отношения? По сути, мне нужно динамически загрузить произвольный объект, затем выяснить, есть ли у него «родительский» элемент, и затем загрузить этот родительский объект.
Есть идеи?
Решение
Маршрутизация не поможет вам, так как она предназначена для использования наоборот. Что вы можете сделать, так это навязать отношения с: parent:
class Task
belongs_to :project
alias :project :parent
end
А затем используйте это отношение, чтобы определить, доступен ли родительский объект:
if object.respond_to?(:parent)
# do something
end
Кроме того, вы можете использовать полиморфные маршруты, если маршруты настроены правильно:
polymorphic_url([object.parent, object])
Другие советы
Приведенный выше код определяет отношения для маршрутов и помогает генерировать правильных помощников для создания путей и тому подобного.
Вам нужно убедиться, что отношения правильно объявлены в ваших документах. В модели проекта вы должны иметь:
has_many :tasks
В вашей модели задачи вы должны иметь:
belongs_to :project
Как только вы это настроите, вы готовы получить то, что хотите.
@task = Task.first
unless @task.project.blank?
project_name = @task.project.name
end