Вложенный ресурс с 2-глубоким объединением - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь настроить Active Admin, чтобы AdminUser (вошел в систему) мог просматривать список всех ServiceUsers, которых он назначил, а затем нажмите на ссылку рядом с конкретным ServiceUser, чтобы увидеть все созданные им сеансы поддержки (для этот конкретный ServiceUser).

Модель:

class ServiceUser
  has_many :support_allocations
  has_many :admin_users, through: :support_allocations
  has_many :support_budgets

class AdminUser < ApplicationRecord
  has_many :support_allocations
  has_many :service_users, through: :support_allocations

class SupportAllocation < ApplicationRecord
  belongs_to :admin_user
  belongs_to :service_user
  has_many :support_sessions

class SupportSession < ApplicationRecord
  belongs_to :invoice, optional: true
  belongs_to :support_allocation
  has_one :service_user, through: :support_allocation
  has_one :admin_user, through: :support_allocation

Я предполагаю, что мне нужно сделать SupportSessions вложенным ресурсом ServiceUser, чтобы я мог следовать принципам отдыха (т. Е. С маршрутом, например, / service_users / 1 / support_sessions). Мне удалось вложить ресурс, как это:

ActiveAdmin.register SupportSession do
  belongs_to :service_user

Но я понимаю, что опускает решающую таблицу соединений SupportAllocation. Кроме того, это не работает! Сообщение об ошибке:

NoMethodError in SupportSessionsController#index
undefined method `support_sessions' for #<ServiceUser:0x00007fe6316b9030> Did you mean? support_allocations

Ранее я мог просматривать все SupportSessions для всех ServiceUsers, выделенных для AdminUser, используя код:

ActiveAdmin.register SupportSession do
super.includes(support_allocation: [:service_user, :admin_user])

Эта проблема, я хотел бы работать с ресурсом в контексте отношения SupportAllocation между ServiceUser и AdminUser. Таким образом, вошедший в систему AdminUser может увидеть список индексов всех ServiceUsers, которых они распределены (через SupportAllocation), а затем перейти к списку индексов всех SupportSessions для выбранного ServiceUser (из этого первого списка).

Является ли вложенный ресурс правильным решением здесь, или есть более простой способ просто иметь общую страницу ресурса SupportSession, которая может показывать SupportSessions для ВСЕХ ServiceUsers или определенного ServiceUser (по «id» в URL)? Как мне работать с этой хитрой двухуровневой ассоциацией с промежуточной таблицей?

Большое спасибо за вашу помощь.

Вот код для моего контроллера support_sessions.rb в app / admin /

ActiveAdmin.register SupportSession do
  menu label: 'My sessions'
  #belongs_to :support_allocation
  belongs_to :service_user

  # Eager loading to speed up queries
  includes :service_user, :admin_user, :support_allocation

  sidebar :help, priority: 0 do
    "Need help? Email us at help@example.com"
  end

  # Default sort order
  config.sort_order = 'support_sessions.date_held_asc'

  controller do
    def scoped_collection
      #super.includes :support_allocation
      super.includes(support_allocation: [:service_user, :admin_user])
      #SupportSession.includes(support_allocation: [:service_user, :admin_user])
      #super.includes :service_user, :admin_user
    end
  end

  scope :all, :default => true
  scope :invoiced
  scope :uninvoiced

  index do
    selectable_column
    column 'Date held', :date_held

    #column 'Service user', :full_name, :sortable => 'service_users.family_name' do |ss|
      #service_user = ServiceUser.find(ss.support_allocation.service_user.service_user_id).full_name
      #ss.support_allocation.service_user
    #end

    #column 'Based at', sortable: 'support_allocation.service_user.organisation.org_name' do |ss|
      #ss.support_allocation.service_user.organisation.org_name
    #end

    column 'Venue', :venue

    #column 'Support worker', :full_name, :sortable => 'admin_users.family_name' do |ss|
      #support_worker = AdminUser.find(ss.admin_user_id).full_name
      #ss.support_allocation.admin_user
    #end

    actions
  end

  permit_params(:admin_user_id, :service_user_id, :venue, :mode_of_delivery, :date_held, :time_start, :time_end, :total_breaks, :status)

  form do |f|
    f.semantic_errors *f.object.errors.keys

    f.inputs 'Support session details' do
      # Code to check if creating a new record or editing an existing record:
      #if f.object.new_record?

      #if current_admin_user.super_admin == false
        # Pre-select only current support worker (so no other choices)
        #f.input :admin_user, :label => 'Support worker', as: :select, collection: AdminUser.where(super_admin: 0, #id: current_admin_user.id), include_blank: false
      #else
        # Otherwise list all support workers
        #f.input :admin_user, :label => 'Support worker', as: :select, collection: AdminUser.where(super_admin: 0), include_blank: true, allow_blank: false
      #end

      #f.input :support_allocation
      #f.input :service_user, :label => 'Service user', as: :select, collection: ServiceUser.all, include_blank: true, allow_blank: false

      f.input :mode_of_delivery, as: :select, collection: SupportSession.mode_of_deliveries.keys, include_blank: true, allow_blank: false

      f.input :venue, :label => 'Venue'
      f.input :date_held, :label => 'Date held', :as => :datepicker
      f.input :time_start, :label => 'Start time'
      f.input :time_end, :label => 'End time'
      f.input :total_breaks, :label => 'Total breaks (in minutes)', :input_html => { :value => '0' }

      if current_admin_user.super_admin == false
        f.input :status, as: :select, collection: SupportSession.statuses.keys, include_blank: true, allow_blank: false
      end
    end
    f.actions
  end


end

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Спасибо за совет по моей модели.

Чтобы исправить мою первоначальную проблему, я вложил свой контроллер SupportSession ActiveAdmin в выделенное расположение поддержки:

ActiveAdmin.register SupportSession do
  menu label: 'My sessions'
  belongs_to :support_allocation

Это создает новый вложенный маршрут для SupportSession в контексте SupportAllocation (который определяет отношения между ServiceUser и SupportSession), позволяя мне создать ссылку (например, / support_allocations / 2 / support_sessions) из SupportAllocation непосредственно на все SupportSessions для индивидуальный ServiceUser, используя обычный помощник пути:

actions defaults: false do |support_allocation|
  link_to 'Manage support sessions', support_allocation_support_sessions_path(support_allocation_id: support_allocation.id), class: 'member_link'
end
0 голосов
/ 29 июня 2019

Я считаю, что ваши регистрации в ActiveAdmin должны отражаться так же, как и в ваших моделях.

Например, у вас есть:

ActiveAdmin.register SupportSession do
  belongs_to :service_user

но ваша SupportSession модель определяется как:

class SupportSession < ApplicationRecord
  ...
  has_one :service_user, through: :support_allocation
  ...

Если ваша модель верна, регистрация ActiveAdmin также должна быть has_one.

Кроме того, похоже, что вы не полностью определили свои модельные отношения. Ваша ServiceUser модель не имеет соответствующей belongs_to связи.

...