Ich habe eine Join-Tabelle, die einem Client- und einem Setor-Modell (Plural: setores) beitritt. Die Beziehung ist, dass ein Client has_and_belongs_to_many Setores (es gibt drei Setores, ein Client kann von einem bis alle drei haben. Setoren haben viele Clients).Zusätzlicher Fremdschlüssel für eine Join-Tabelle
Mein Problem ist: In dieser Join-Tabelle habe ich einen Verweis auf das Benutzermodell hinzugefügt. Setoren haben viele Benutzer, aber eine Beziehung zwischen einem Client und einem Setor hat nur einen Benutzer. Aber ich weiß nicht, wie diese Zuordnung in der Tabelle clients_setores lesen und schreiben.
Meine Modelle sind wie folgt:
class Client < ActiveRecord::Base
has_and_belongs_to_many :documents
has_and_belongs_to_many :setores
has_many :screenings
has_many :contacts
has_many :interactions, through: :contacts
validates :cnpj, uniqueness: true
class Setor < ActiveRecord::Base
self.table_name = 'setores'
has_many :documents
has_many :screenings
has_many :users
has_and_belongs_to_many :clients
attr_acessor :user_id
class User < ActiveRecord::Base
has_one :setores
has_many :clients
Und die aktuelle Tabellen-Parameter verbinden, die so gearbeitet haben am Ende des Clients Controller angezeigt:
private
# Use callbacks to share common setup or constraints between actions.
def set_client
@client = Client.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def client_params
params.require(:client).permit(:cnpj, :pacote, :razsoc, :vencimento, user_ids:[], document_ids:[], setor_ids:[])
end
Beachten Sie, dass „benutzerkennungen: [ ] "war mein Versuch, es zur Arbeit zu bringen, was bisher gescheitert ist.
In den Ansichten ich die aktuelle verwende Join-Tabellen wie folgt (von /client/_form.html.erb genommen):
<%= f.collection_check_boxes :setor_ids, Setor.where(pacote: true), :id, :setor do |b| %>
Also mit diesem Kontrollkästchen kann ich einen Eintrag in der clients_setores Tabelle erstellen.
Was ich tun möchte ist in der Lage, einen Benutzer, der zu einer bestimmten Setor_id gehört, aus einem Dropdown-Menü auswählen und diese Beziehung in der Join-Tabelle speichern. Ich habe es geschafft, zu solchen Menü mit dem folgenden Code erscheinen, in der gleichen _form.html.erb:
<%= f.collection_select :user_ids, User.where(:setor_id => 1), :id, :email %>
Aber wenn ich das Formular abschicken, werden die Werte nicht gespeichert. Ich weiß nicht, ob mein Problem nur darin besteht, dass ich nicht den richtigen Weg gefunden habe, diese Assoziation aus meiner Sicht aufzunehmen, oder ob mein Problem weiter unten im Controller (wahrscheinlich) und im Modell (vielleicht) liegt.
Das nächste Problem, das ich in SO fand, war Rails 4 Accessing Join Table Attributes, aber der Zuordnungstyp ist anders (has_many/through) und es gibt keine dritte Beziehung beteiligt, so dass ich nicht herausfinden konnte, wie es für mich funktioniert.
Hey, ich habe deine Frage nicht ganz verstanden, wenn du erklären könntest, was du meinst "Mein Problem ist: In dieser Join-Tabelle habe ich einen Verweis auf das Benutzermodell hinzugefügt." Die Join-Tabelle für has_and_belongs_to_many lässt nur zwei zu Spalten (die Fremdschlüssel für Ihre setor- und client-Tabelle). Wenn Sie also sagen, dass Sie einen Verweis auf diese Tabelle hinzufügen möchten, müssen Sie eine "has_many through" -Einstellung verwenden. Außerdem haben Sie nicht angegeben, dass Ihr Client zu einem Benutzer in Ihrem Clientmodell gehört. – bkunzi01
Damit ein Client viele Benutzer hat, müsste er über die gleiche Anzahl von Setores (1 setor: 1 client; 3 setores: 3 clients) verfügen, funktioniert die has_many/through-Beziehung so? Wie für den Client, der dem Benutzer gehört, gehört er immer zu so vielen Benutzern wie Setores; ist das relevant? –
Ok, also sagen Sie, wenn ein Client einen Benutzer haben soll, muss er auch einen Setore haben? Sorry, ich bin mir immer noch nicht sicher, was du zu tun versuchst, aber wenn du einen Weg brauchst, um sicherzustellen, dass Clients und Einstellungen auch über Benutzer gleichzeitig wissen, musst du eine "has_many through" -Verbindung verwenden, damit du Sie können dieser Join-Tabelle zusätzliche Spalten hinzufügen, um die zusätzlichen Informationen für Benutzer zu speichern. – bkunzi01