Как использовать ActiveAdmin на моделях, использующих has_many через ассоциацию? - PullRequest
48 голосов
/ 18 августа 2011

Я использую 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. показывать дату встречи каждого пациента на странице врачей?
  2. редактировать дату приема каждого пациента на странице врачей?

Спасибо всем.:)

Ответы [ 6 ]

75 голосов
/ 18 августа 2011

Для 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's 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's 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
14 голосов
/ 27 января 2012

В ответе tomblomfield последующий вопрос в комментариях:

Попробуйте следующее в блоке do модели AA ActiveAdmin.register:

  controller do
    def scoped_collection
      YourModel.includes(:add_your_includes_here)
    end
  end

Это должно лениво загрузить все ваши ассоциации для каждого индексастраница в отдельном запросе

HTH

1 голос
/ 03 марта 2017

Это работа для меня (с избранным)

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
1 голос
/ 19 июня 2015

Это должно решить проблему запроса 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
0 голосов
/ 27 августа 2016

Если вы хотите показать несколько полей в строке панели, вы можете использовать следующий вид:

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

Чтобы поместить его в форму редактирования, сначала добавьте назначение__данных в разрешенный список:

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

Должно работать, если нет ошибки кодирования.

0 голосов
/ 20 января 2015

@ 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

...