2017-08-23 15 views
0

Ich werde massiv auf eine Angehörig-Beziehung gebunden, die in meinen Gedanken ziemlich einfach sein sollte.Gehört zu Foreign Key

Wenn ich eine Datenbankzuordnung bei einer Migration von einem Ticket zu einem Konto erstelle, erstellt sie ein Datenbankfeld namens 'account_id' in der Tabelle 'Tickets', was in Ordnung ist. Da ist in meinem Ticket Modell Ich habe:

belongs_to :created_by, class_name: 'Account' 

Aber wie Schienen 5, belongs_to Beziehungen automatisch eine Validierung der Anwesenheit Voraussetzung für account_id hinzufügen. Aber wenn ich created_by übergebe, schlägt die Validierung fehl. Ich möchte die Anwesenheit von created_by nicht account_id überprüfen. So füge ich das optional: true Tag

belongs_to :created_by, class_name: 'Account', optional: true 

dann Anwesenheit von separat

validates_presence_of :created_by 

das alles funktioniert erstellt bestätigen, aber ich mag es nicht, dass ich mich im Widerspruch durch optional sagen und dann validieren eine Zeile später für was ist eigentlich das gleiche Feld!

Ich habe dann zu denken, was ist, wenn das Feld in der Datenbank auf der Ticket-Tabelle tatsächlich created_by heißt und mit einigen primären und fremden Schlüssel Sachen ich die Beziehung bauen, sollte es richtig beheben?

Aber ich bin mir nicht sicher, wie man die Migration aufbauen und dann wie auf der Erde, um das gehört zu schreiben. Ich hatte versucht:

add_column :tickets, :created_by, :bigint 
add_index :tickets, :created_by 

und

belongs_to :created_by, class_name: 'Account', foreign_key: :created_by, primary_key: :account_id 

aber komplett ausfällt, aber wenn ich

belongs_to :account, foreign_key: :created_by 

das mir ermöglicht created_by zu aktualisieren mit einem account_id von 1 sagen, aber wenn Ich rufe ticket.created_by Ich bekomme die Int und ticket.account gibt das Konto zurück. Ich möchte, dass es andersherum ist.

+0

Je mehr ich dies zu betrachten, ich denke, es ist ein Fehler in der Art und Weise, wie rails seine validates_presence_of für die assignes_to erzeugt. Es verwendet die Tabellenspalte für die Beziehung, die ich definiere. – rmaspero

Antwort

1

Also mein Problem war in der Art, wie die Migration mit Rails Beziehungen interagiert. Ich habe eine Spalte namens created_by erstellt und eine ID darin gespeichert. Was bedeutete, created_by gab die ID nicht die Beziehung zurück.

add_reference(:tickets, :created_by, foreign_key: {to_table: :accounts}) 

, die auf der Karten-Tabelle ein created_by_id erstellt:

Die Migration sollte wie ausgesehen haben. Dann auf dem Karten-Modell alles, was ich brauchte, war:

belongs_to :created_by, class_name: 'Account' 

und für ein Konto seiner Karten sehen würden Sie in der Lage zu tun:

has_many :tickets, foreign_key: 'created_by_id'