2011-08-17 29 views
46

Tôi đang sử dụng ActiveAdmin đá quý trong dự án của mình.Làm cách nào để sử dụng ActiveAdmin trên các mô hình sử dụng has_many thông qua liên kết?

Tôi có 2 mô hình sử dụng has_many thông qua liên kết. Lược đồ cơ sở dữ liệu trông giống hệt như ví dụ trong RailsGuide. http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association has_many through association http://guides.rubyonrails.org/images/has_many_through.png

Làm thế nào tôi có thể sử dụng ActiveAdmin để ...

  1. chương trình ngày hẹn của mỗi bệnh nhân trong trang bác sĩ?
  2. chỉnh sửa ngày hẹn của từng bệnh nhân trong trang bác sĩ?

Cảm ơn tất cả. :)

+0

gì đã làm bạn sử dụng để tạo ra rằng sơ đồ er? –

+2

Tôi không tạo ra điều đó. Tôi lấy nó từ trang web Rails Guide. –

+7

Những gì chúng ta cần tìm hiểu là những gì THEY sử dụng để tạo ra sơ đồ đó! –

Trả lời

70

Đối 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 

Đối 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 
+2

Tôi đang làm một điều tương tự, nhưng nó kết thúc bằng một SQL cơn ác mộng. Mỗi cuộc gọi đến timer.patient tạo ra một truy vấn SQL khác .. vấn đề truy vấn chuẩn n + 1. Có ai tìm thấy cách làm tương đương với tải háo hức của ActiveRecord không? Ví dụ: bao gồm (: bệnh nhân) – tomblomfield

+0

Tôi có một số rắc rối với giải pháp của bạn. Đầu vào _destroy sẽ không hoạt động trong trường hợp của tôi – Awea

+0

có thể có nhiều lý do và "không hoạt động" là không đủ để tôi biết chính xác điều gì sai. Tôi lấy làm tiếc vì điều đó. – PeterWong

13

Trong câu trả lời tomblomfield theo dõi câu hỏi trong ý kiến:

Hãy thử như sau trong AA ActiveAdmin.register Model của bạn làm block:

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

này nên lười biếng tải tất cả các hiệp hội của bạn cho mỗi trang chỉ mục trong một truy vấn riêng biệt

HTH

+1

'scoped_collection' không được gọi trên màn hình' show', do đó, điều này sẽ không giải quyết được vấn đề của tomblomfield, vì anh ta đang nói về các truy vấn N + 1 trên màn hình 'show'. Tôi đang chạy vào điều này quá, và đã không tìm thấy một giải pháp. – monfresh

+0

Tôi nghĩ rằng những gì bạn đang tìm kiếm là 'def find_resource', nơi bạn có thể chạy' Foo.includes (: bars) .find (params [: id]) ' – Tashows

0

@monfresh @tomblomfield bạn có thể làm

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

trong mô hình bác sĩ

... hoặc, tôi không chắc liệu bạn có thể sử dụng nó với formtastic hay không nhưng bạn có thể làm cho phạm vi tùy chọn bằng một cái gì đó như

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

appointment.patient wont n + 1 nữa

1

Nó sẽ giải quyết vấn đề truy vấn 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

Nếu bạn muốn nhiều lĩnh vực hiển thị trong một dòng panel bạn có thể sử dụng chế độ sau:

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 

Để đặt nó vào bạn redit tạo appointment_ids đặt đầu tiên vào danh sách được phép:

permit_params: appointment_ids:[] 

Thêm có nhiều mối quan hệ với biểu mẫu

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 

Nên hoạt động nếu không có lỗi mã hóa.

1

Đó là công việc đối với tôi (với lựa chọn)

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 
Các vấn đề liên quan