2016-11-16 3 views
2

Ich habe folgenden Code:Ruby on Rails ActiveRecord Was macht alles nach einem Fund?

@contacts = Project.find(params[:project_id].to_i).contacts 

Kann mich jemand erklären, was .contacts Teil dieser Zeile am Ende tun tut? Ich versuche herauszufinden, aber ich kann keine Antwort finden. Ich denke, es muss etwas wie ein Einschluss oder etwas sein, aber ich verstehe es wirklich nicht. Wäre wirklich glücklich für irgendeinen Rat (vielleicht würde nur ein Link zu einer Erklärung reichen. Ich habe versucht, etwas zu finden, aber ich weiß nicht, was ich suchen muss, weil ich keine Ahnung habe, was das ist.)

+0

stellen Sie sicher, eine Antwort zu wählen, die am besten zu Ihrer Frage passt und markieren Sie es. Auf diese Weise können Sie anderen Benutzern mitteilen, dass Ihr Problem gelöst ist. –

Antwort

2

Sie find ein einzelnes Projekt Objekt mit

Project.find(params[:project_id].to_i) # returns a Project instance 

und seine dann contacts zugeordnet bekommen.

Es entspricht

+0

Vielen Dank. Jetzt verstehe ich ein bisschen mehr. : P Noch zu komplex zu verstehen, was das ganze Programm macht, aber das ist der Grund, warum ich es lernen will! Und thx für die Beratung mit de to_i, aber ich denke, es ist nicht schlecht, es zu tun? Dieser Code ist Teil einer API, gibt es keine Gefahr für SQL-Injektionen, wenn ich das nicht auf to_i stelle? – Twinfriends

+1

@Twinfriends du bist willkommen! Es ist nicht schlecht, 'params [: project_id]' it in integer zu konvertieren. Wie bei der SQL-Injection - da 'find'-Methode entweder String oder Integer verwendet und eine Abfrage wie' SELECT projects. * FROM Projekte WHERE projects.id = $ 1' erstellt. Ich denke, es ist nicht anfällig für die Injektion, aber im Allgemeinen haben Sie recht will eingehende params sanieren :) –

+0

Und nochmal, danke! :) – Twinfriends

4

.contacts Methode liefert eine Sammlung von Contact Objekte mit Ihrem Project Modell zugeordnet.

Sie müssen eine has_many :contacts Beziehung dort auf Ihrem Project Modell definiert haben (app/models/project.rb) und belongs_to :project auf Ihrem Contact Modell (app/models/contact.rb).

Dieser Verein ist eine Active Abstraktion für die Beziehung zwischen der projects und contacts Tabelle auf Ihrer Datenbank, was bedeutet, dass eine Zeile auf projects Tabelle (dh ein Project Objekt) viele Kontakte (dh viele Zeilen auf contacts Tabelle) haben kann, basierend auf ein Fremdschlüssel project_id auf der contacts Tabelle.

Im Code @contacts = Project.find(params[:project_id].to_i).contacts die find Methode gibt ein einzelnes Objekt (Project Modell) von Ihrer projects Tabelle mit dem Wert der Spalte id als params[:project_id] geben. Dann gibt .contacts alle zugehörigen Zeilen aus der Tabelle contacts zurück (Zeilen mit dem Wert project_id entsprechen params[:project_id].to_i).

In einer einzigen Tabelle Schienen activecord Operation, Die folgende Zeile gibt die gleiche Liste der Zeilen von contacts Tabelle mit Spalte project_id mit Wert params[:project_id].to_i als die Zeile in Ihrer Frage.

@contacts = Contact.where(project_id: params[:project_id].to_i) 

Dies gibt alle Zeilen in contacts Tabelle den Wert der Spalte gleich project_idparams[:project_id].to_i aufweist.

Schienen verfügt über hervorragende Dokumentationen auf activerecord associations und active record

0

in Ihrer Frage ist contacts eine Methode, die auf dem Ergebnis einer Methode aufgerufen wird, die auf einem anderen Objekt

In diesem Fall genannt wurde, ist es ein Sende Nachricht contacts an das Active Objekt, das von der find Methode aufgerufen auf die Project Klasse

Ob das Ergebnis der Lage ist, antworten auf diese Nachricht zurückgegeben wird, ist nicht als str wie du denkst. Sie erhalten häufig Fehler wie diese in Ruby:

undefined method `contacts' for nil:NilClass 

jedoch, dass es unwahrscheinlich ist, in diesem Fall nicht geschehen, weil die find Methode eine Ausnahme auslöst, wenn es nicht den Datensatz finden können (während find_by gibt nil zurück)

Denken Sie daran, dass in Ruby alles ist ein Objekt und Methode Anrufe können angekettet werden

Verwandte Themen