Я пытаюсь настроить 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