2016-12-30 4 views
0

Ich habe ein paar Modelle in meinem Projekt: Anfrage, Arbeit, Auto und Mitarbeiter. Arbeit ist ein Zwischenmodell zwischen Anfrage und Auto/Mitarbeiter.Rails polymorphe Zuordnung wird nicht gespeichert _Typ

Hier sind die Verbände:

Anfrage

has_many :works, dependent: :destroy 
def performers 
    works.map {|x| x.performer} 
end 

Arbeit

belongs_to :request 
belongs_to :performer, polymorphic: true 

Auto

has_many :works, as: :performer 
has_many :requests, through: :works, as: :performer 

Mitarbeiter

has_many :works, as: :performer 
has_many :requests, through: :works, as: :performer 

Ansicht Arbeiten zum Erstellen:

<%= form_for([@request, @work]) do |f| %> 
    <%= (f.collection_select :performer_id, Employee.all, :id, :name) if @request.type == "StaffRequest" %> 
    <%= (f.collection_select :performer_id, Car.all, :id, :select_info) if @request.type == "CarRequest" %> 
    <%= f.submit 'OK' %> 
<% end %> 

Arbeits Controller

def new 
    @work = @request.works.new 
    end 

    def create 
    @work = @request.works.new(work_params) 
    end 

    def work_params 
     params.require(:work).permit(:performer_id, :request_id) 
    end 

Die probl em ist, dass meine Spalte performer_type immer leer ist, sie speichert den Klassennamen nicht. Was kann das Problem sein? Irgendwelche Ideen?

+1

Können Sie den Code bereitstellen, den Sie verwenden, der eine Zeile in der 'works' Tabelle erstellt? ZB "Work.create" oder "Employee.new (...) .save"? – coreyward

+0

In 'has_many: Anfragen' Warum haben Sie' as:: performer' hinzugefügt? Das 'Through' sollte ausreichen. – Deep

Antwort

2

Es ist leer, weil Sie es did't passieren, sollten Sie ein verstecktes Feld hinzufügen für Sie bilden:

<%= form_for([@request, @work]) do |f| %> 
    <% if @request.type == "StaffRequest" %> 
    <%= (f.hidden_field :performer_type, value: "Employee") %> 
    <%= (f.collection_select :performer_id, Employee.all, :id, :name) %> 
    <% elsif @request.type == "CarRequest" %> 
    <%= (f.hidden_field :performer_type, value: "Car") %> 
    <%= (f.collection_select :performer_id, Car.all, :id, :select_info) %> 
    <% end %> 
    <%= f.submit 'OK' %> 
<% end %> 
+0

Ich habe immer polymorphe Assoziationstyp ist etwas, das Schienen für Sie berechnet – Marat

0

neben: performer_id, müssen Sie das weitergeben müssen: auch performer_type, ein Weg, dies zu tun ist, über das Formular select_tag:

<%= f.grouped_collection_select :global_performer, [ Car, Employee ], :all, :model_name, :to_global_id, :name %> 
:

def create 
    @work = @request.works.new(work_params) 
end 

def work_params 
    # use :performer if you use :performer as in the select form field 
    params.require(:work).permit(:performer, :request_id) 

    # OR 

    # use :performer_id & :performer_type if you also use the hidden field 
    params.require(:work).permit(:performer_id, :performer_type, :request_id) 
end 

Es ist ein gutes Beispiel (für Rails 4.2) ein einzelnes ausgewähltes Formularfeld für polymorphe verwenden, so dass Sie wie schreiben ist

How to create grouped select box in Rails for polymorphic association using Global ID?

Verwandte Themen