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 ...
- mostrar la fecha de cita de cada paciente en la página de médicos?
- 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.