Rails has_many:通过嵌套形式 [英] Rails has_many :through nested form
问题描述
我刚刚跳入has_many :through
关联.我正在尝试通过一种形式来实现为所有3个表(Physician
,Patient
和关联表)保存数据的功能.
I have just jumped into has_many :through
association. I'm trying to implement the ability to save data for all 3 tables (Physician
, Patient
and association table) through a single form.
class CreatePhysicians < ActiveRecord::Migration
def self.up
create_table :physicians do |t|
t.string :name
t.timestamps
end
end
end
class CreatePatients < ActiveRecord::Migration
def self.up
create_table :patients do |t|
t.string :name
t.timestamps
end
end
end
class CreateAppointments < ActiveRecord::Migration
def self.up
create_table :appointments do |t|
t.integer :physician_id
t.integer :patient_id
t.date :appointment_date
t.timestamps
end
end
end
我的模特:
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, :through => :appointments
accepts_nested_attributes_for :appointments
accepts_nested_attributes_for :physicians
end
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, :through => :appointments
accepts_nested_attributes_for :patients
accepts_nested_attributes_for :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
end
我的控制器:
def new
@patient = Patient.new
@patient.physicians.build
@patient.appointments.build
end
我的视图(new.html.rb
):
My view (new.html.rb
):
<% form_for(@patient) do |patient_form| %>
<%= patient_form.error_messages %>
<p>
<%= patient_form.label :name, "Patient Name" %>
<%= patient_form.text_field :name %>
</p>
<% patient_form.fields_for :physicians do |physician_form| %>
<p>
<%= physician_form.label :name, "Physician Name" %>
<%= physician_form.text_field :name %>
</p>
<% end %>
<p>
<%= patient_form.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', patients_path %>
我能够为Appointment
创建一个新的Patient
,Physician
和相关记录,但是现在我也希望在表单中也有一个appointment_date
字段.我应该在哪里放置Appointment
的字段,并且控制器中需要进行哪些更改?我尝试了Google搜索,并尝试了 this ,但是在实现它时陷入了某些或其他错误.
I'm able to create a new Patient
, Physician
and associated record for an Appointment
, but now I want to have field for appointment_date
too in form. Where should I place fields for Appointment
s and what changes are required in my controller? I tried googling and tried this, but got stuck in some or other error implementing it.
推荐答案
好,这个小问题让我困扰了几个小时,所以我将在这里发布我的工作解决方案,希望可以节省一些时间偷看.这适用于Rails 4.0和Ruby 2.0.这也克服了我遇到的符号到整数转换"的问题.
Ok, this little bugger of a question stumped me for a few hours, so I'm going to post my working solution on here in hopes it shaves some time for peeps. This is for Rails 4.0 and Ruby 2.0. This also overcame a "symbol to integer conversion" issue I had.
型号:
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, :through: :appointments
accepts_nested_attributes_for :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
accepts_nested_attributes_for :physician
end
class Physicians < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
end
控制器:
def new
@patient= Patient.new
@appointments = @patient.appointments.build
@physician = @appointments.build_physician
end
def create
Patient.new(patient_params)
end
def patient_params
params.require(:patient).permit(:id, appointments_attributes: [:id, :appointment_time, physician_attributes: [:id ] )
end
查看
<% form_for(@patient) do |patient_form| %>
<%= patient_form.error_messages %>
<p>
<%= patient_form.label :name, "Patient Name" %>
<%= patient_form.text_field :name %>
</p>
<% patient_form.fields_for :appointments do |appointment_form| %>
<p>
<%= appointment_form.label :appointment_date, "Appointment Date" %>
<%= appointment_form.date_field :appointment_date %>
</p>
<% appointment_form.fields_for :physician do |physician_form| %>
<p>
<%= physician_form.label :name, "Physician Name" %>
<%= physician_form.text_field :name %>
</p>
<% end %>
<% end %>
<p>
<%= patient_form.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', patients_path %>
这篇关于Rails has_many:通过嵌套形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!