Umwandeln has_many und: belongs_to mit has_many: durch
-
27-09-2019 - |
Frage
Ich habe einen aktuellen Verein gilt:
Group :has_many Employees
und Employee :belongs_to Group
aber jetzt möchte ich ein Angestellter als auch zu vielen Gruppen zugeordnet werden.
Zu diesem Zweck Ich denke machen:
groupizations group_id:integer employee_id:integer created_at:datetime
Dies wird Mitarbeiter und Gruppenmodelle ändern:
class Groupizations < ActiveRecord::Base
belongs_to :employee
belongs_to :group
end
class Group < ActiveRecord::Base
has_many :groupizations
has_many :employees, :through => categorizaitons
end
class Employee < ActiveRecord::Base
has_many :groupizations
has_many :groups, :through => categorizaitons
end
Ich verstehe all dies von Railscasts Folge auf vielen to-Many. Das Einzige, was ich bin verwirrt ist, dass jetzt ich einen neuen Mitarbeiter mit folgendem Code zu erstellen:
def create
@employee = Employee.new(params[:employee])
if @employee.save
flash[:notice] = "Successfully created employee."
redirect_to @employee
else
render :action => 'new'
end
end
Wie wird dieser Code ändern? Muss ich hinzufügen, Daten in groupizations
zugleich jetzt?
Lösung
Wenn Sie einen Mitarbeiter zu einer Gruppe hinzufügen möchten, müssen Sie nur tun müssen, um:
@employee.groups << @group
Der Groupization
Datensatz, wie Sie es genannt haben, werden automatisch erstellt. Wenn Sie einige Meta-Daten in der Vereinigung setzen wollen, die gemeinsam ist, wenn man die Natur dieser Beziehung angeben möchten, könnten Sie etwas mehr formal tun:
@employee.groupizations.create(
:group => group,
:badge_number => 'F920'
)
Wie kommen Modelle typischerweise einen eindeutigen Index für die beiden ID-Spalten haben, sollten Sie von Fehlern zu Rettung, die auftreten können, wenn ein doppelter Datensatz eingefügt wird. Diese Optik unterscheiden sich je nach Ihrem Backend-DB, so Test entsprechend. Sie können find_or_create
verwenden je nach Bedarf.