2017-02-01 3 views
0

Ich stehe vor einem dummen Problem. Ich habe eine Sammlung erstellt, die Elemente in einer Join-Tabelle "staffs_task" erstellt, um eine Zuordnung zwischen dem Modellpersonal und der Aufgabe zu referenzieren. Und jetzt möchte ich zwei Dinge: (1) eine Schaltfläche löschen Sie diese Zuordnung (2) und ein wenig Code für mein Modell staffs_task, um Doppelarbeit zu vermeiden, so mit der Task_id und staff_id. Und letzte Info, Aufgabe ist ein Modell von Ranch gebautLöschen Sie ein Element aus einer Sammlung

mein Code:

(die Sammlung in new_task)

<%= select_tag "staffs_task", options_from_collection_for_select(@staffs, 'id', 'name') , :multiple => true %> 

(task_controller)

skip_before_action :configure_sign_up_params 
    before_action :set_ranch 
    before_action :set_task, except: [:create] 



    def create 
    @task = @ranch.tasks.create(task_params) 
    @staffs = Staff.where(:id => params[:staffs_task]) 
    @task.staffs << @staffs 
    if @task.save 
     @task.update(done: false) 
     @task.update(star: false) 
     flash[:success] = "The task was created " 
    else 
     flash[:success] = "The task was not created " 
    end 
    redirect_to @ranch 
    end 


private 

    def task_params 
    params.require(:task).permit(:content, :deadline, :row_order, :date, :assigned_to) 
    end 

    def set_ranch 
    @ranch = Ranch.find(params[:ranch_id]) 
    end 

    def set_task 
    @task = @ranch.tasks.find(params[:id]) 
    end 

Also, wenn Sie welche haben Idee über eines dieser zwei Dinge, wäre Ihre Hilfe willkommen Vielen Dank im Voraus!

Antwort

0

Lassen Sie uns sagen Sie folgende viele haben zu viele Setup mit einem Modell verbinden:

class Staff 
    has_many :assignments 
    has_many :tasks, through: :assignments 
end 

class Task 
    has_many :assignments 
    has_many :staff, through: :assignments 
end 

class Assignment 
    belongs_to :task 
    belongs_to :staff 
end 

Beachten Sie, dass die plural of staff is staff - es sei denn, Sie sprechen über die von Assistenten durch Sticks.

ActiveRecord erstellt "magische" _ids Setter für alle has_many Beziehungen. Bei Verwendung mit einer has_many through:-Beziehung ist rails intelligent genug, um die Zeilen einfach aus der Join-Tabelle zu entfernen.

diese Weise können Sie mit den collection_select und collection_checkboxes Methoden:

<%= form_for([@task.ranch, @task]) do |f| %> 
    <%= f.collection_select(:staff_ids, Staff.all, :id, :name, multiple: true) %> 
<% end %> 

würden Sie dann Ihren Controller wie so ein:

def create 
    @task = @ranch.tasks.new(task_params) do |t| 
    # this should really be done by setting default values 
    # for the DB columns 
    t.done = false 
    t.star = false 
    end 

    if @task.save 
    redirect_to @ranch, success: "The task was created" 
    else 
    render :new, error: "The task was not created" 
    end 
end 

private 

def task_params 
    params.require(:task) 
    .permit(:content, :deadline, :row_order, :date, :assigned_to, staff_ids: []) 
end 

staff_ids: [] wird eine Reihe von skalaren Werten ermöglichen. Auch nicht das .new und .create sind nicht das Gleiche! Sie haben den Datensatz viermal gespeichert, wenn er gültig war, so dass der Benutzer auf vier teure Schreibabfragen warten muss, wenn einer dies tut.

Verwandte Themen