ruby-on-rails ruby-on-rails-3 associations gem activeadmin

ruby on rails - ¿Cómo usar ActiveAdmin en modelos usando has_many a través de la asociación?



ruby-on-rails ruby-on-rails-3 (6)

@monfresh @tomblomfield puedes hacer

has_many :appointments, ->{ includes(:patients) }, :through => :patients

en el modelo de los médicos

... o, no estoy seguro si puedes usarlo con formtastic pero podrías hacer el alcance opcional con algo como

has_many :appointments :through => :patients do def with_patients includes(:patients) end end

and appointment.patient no tiene n + 1

Estoy usando la gema ActiveAdmin en mi proyecto.

Tengo 2 modelos usando has_many a través de la asociación. El esquema de la base de datos se ve exactamente igual que el ejemplo en RailsGuide. http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association has_many a través de la asociación http://guides.rubyonrails.org/images/has_many_through.png

¿Cómo puedo usar ActiveAdmin para ...

  1. mostrar la fecha de cita de cada paciente en la página de médicos?
  2. editar la fecha de cita de cada paciente en la página de médicos?

Gracias a todos. :)


Debería resolver el problema de consulta 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


En respuesta tomblomfield pregunta de seguimiento en los comentarios:

Intente lo siguiente en su bloque de acciones AA ActiveAdmin.register modelo:

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

Esto debería cargar perezadamente todas sus asociaciones para cada página de índice en una consulta separada

HTH


Es trabajo para mí (con elegido)

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


Para 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

Para 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


Si desea mostrar múltiples campos en una fila de paneles, puede usar la siguiente vista:

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

Para colocarlo en forma de redit, primero ponga appointment_ids en la lista permitida:

permit_params: appointment_ids:[]

Agregar tiene muchas relaciones con el formulario

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

Debería funcionar si no hay un error de codificación.