2015-12-26 2 views
0

Использование Rails 4.Сохранение дополнительных атрибутов в соединительной таблице для Rails 4

# premedication.rb 
class Premedication < ActiveRecord::Base 
    has_many :premedication_dosages 
    has_many :patients, through: :premedication_dosages 
end 

# patient.rb 
class Patient < ActiveRecord::Base 
    has_many :premedication_dosages 
    has_many :premedications, through: :premedication_dosages 
end 

# premedication_dosage.rb 
class PremedicationDosage < ActiveRecord::Base 
    belongs_to :patient 
    belongs_to :premedication 
end 

# patients_controller.rb 
def patient_params 
    params.require(:patient).permit(
    premedication_ids: [], 
) 
end 

# premedication_dosages join table 
class CreatePremedicationDosage < ActiveRecord::Migration 
    def change 
    create_table :premedication_dosages do |t| 
     t.belongs_to :patient, index: true 
     t.belongs_to :premedication, index: true 
     t.integer :dosage 
    end 
    end 
end 

# _form.html.erb 
<%= form_for @patient do |f| %> 
    <%= f.label :premedication %><br> 
    <%= f.collection_check_boxes :premedication_ids, Premedication.all, :id, :name do |b| %> 
    <div class="collection-check-box"> 
     <%= b.check_box %> 
     <%= b.label %> 
    </div> 
    <% end %> 
<% end %> 

Теперь выше работает отлично, храня premedication_id и patient_id в premedication_dosages таблице, но есть колонка в premedication_dosages называется dosage, который Я хочу сохранить значение. Конечный результат я хочу в premedication_dosages таблице:

premedication_id: 1 
patient_id: 1 
dosage: 10 

Как следует текстовое поле для dosage быть включены в форме?

ответ

0

Вы должны будете использовать accepts_nested_attributes_for:

# patient.rb 
class Patient < ActiveRecord::Base 
    has_many :premedication_dosages 
    has_many :premedications, through: :premedication_dosages 

    accepts_nested_attributes_for :premedication_dosages 
end 


def patient_params 
    params.require(:patient).permit(premedication_dosages_attributes: [:dosage, :premedication]) 
end 

Это будет означать, что вам придется изменить свою форму структуру:

#app/conntrollers/patients_controller.rb 
class PatientsController < ApplicationController 
    def new 
     @premedication = Premedication.all 
     @patient = Patient.new 
     @patient.premedication_dosages.build 
    end 
end 

<%= form_for @patient do |f| %> 
    <%= f.fields_for :premedication_dosages do |d| %> 
    <%= f.collection_select :premedication, @premedications, :id, :name %> 
    <%= f.number_field :dosage %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

Конечно, это только позволит вам добавить один premedication_dosage, что означает, что вам нужно будет использовать что-то вроде Cocoon, чтобы добавить динамически динамически.

Я могу написать около cocoon, если вы хотите, это займет некоторое время, поэтому я оставлю его, пока вы не сообщите мне, является ли то, что вам нужно.

+0

Спасибо @Rich Peck, но мне нужно, чтобы это был флажок, где он может быть несколькими, и каждый выбор принимает значение «дозировка» (если выбрано). – Victor