Как использовать ActiveAdmin для моделей, используя has_many через объединение?
Я использую ActiveAdmin gem в своем проекте.
У меня есть 2 модели, используя has_many через ассоциацию. Схема базы данных выглядит точно так же, как пример в RailsGuide. http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
has_many через ассоциацию http://guides.rubyonrails.org/images/has_many_through.png
Как использовать ActiveAdmin для...
- показать дату назначения каждого пациента на странице врачей.
- изменить дату назначения каждого пациента на странице врачей.
Спасибо всем.:)
Ответы
Ответ 1
Для 1)
show do
panel "Patients" do
table_for physician.appointments do
column "name" do |appointment|
appointment.patient.name
end
column :appointment_date
end
end
end
Для 2)
form do |f|
f.inputs "Details" do # physician fields
f.input :name
end
f.has_many :appointments do |app_f|
app_f.inputs "Appointments" do
if !app_f.object.nil?
# show the destroy checkbox only if it is an existing appointment
# else, there already dynamic JS to add / remove new appointments
app_f.input :_destroy, :as => :boolean, :label => "Destroy?"
end
app_f.input :patient # it should automatically generate a drop-down select to choose from your existing patients
app_f.input :appointment_date
end
end
end
Ответ 2
В ответ на вопрос омбудсмании в комментариях:
Попробуйте выполнить следующие действия в блоке do блока AD ActiveAdmin.register:
controller do
def scoped_collection
YourModel.includes(:add_your_includes_here)
end
end
Это должно ленить загружать все ваши ассоциации для каждой страницы индекса в отдельном запросе
НТН
Ответ 3
Он должен решить проблему с запросом N + 1.
show do
panel "Patients" do
patients = physician.patients.includes(:appointments)
table_for patients do
column :name
column :appointment_date { |patient| patient.appointments.first.appointment_date }
end
end
end
Ответ 4
Он работает для меня (с выбранным)
permit_params category_ids: []
form do |f|
inputs 'Shop' do
input :category_ids, collection: Category.all.collect {|x| [x.name, x.id]}, as: :select, multiple: true, input_html: { class: "chosen-input", style: "width: 700px;"}
end
f.actions
end
Ответ 5
@monfresh @tomblomfield вы можете сделать
has_many :appointments, ->{ includes(:patients) }, :through => :patients
в модели врачей
... или я не уверен, что вы можете использовать его с formtastic, но вы можете сделать область необязательной с чем-то вроде
has_many :appointments :through => :patients do
def with_patients
includes(:patients)
end
end
и appointment.patient
больше не будет + 1
Ответ 6
Если вы хотите показать несколько полей в строке панели, вы можете использовать следующий вид:
show do |phy|
panel "Details" do
attributes_table do
... # Other fields come here
row :appointment_dates do
apps=""
phy.appointments.all.each do |app|
apps += app.patient.name + ":" + app.appoinment_date + ", "
end
apps.chomp(", ")
end
end
end
end
Чтобы поместить его в выбранную форму, сначала поставьте параметр destination_ids в разрешенный список:
permit_params: appointment_ids:[]
Добавить имеет много отношений к форме
form do |f|
f.has_many :appointments do |app|
app.inputs "Appointments" do
app.input :patients, :as => :select, :label => "Assigned Patients"
app.input :appointment_date
end
end
end
Должен работать, если ошибка кодирования отсутствует.