2008-11-11 5 views
25

Ich habe eine Schleife (für Element in @dataset) und ich möchte in jeder Iteration verschiedene Daten aus einer anderen Tabelle abrufen und einige Operationen, die gedruckt werden in der Ansicht. Ich kann diese Daten nicht aus dem Datensatz in der Schleife abrufen.Rails: Abrufen von Daten aus einer Tabelle für jede Iteration einer Schleife

Wie kann ich dies gemäß MVC tun? Ich kann den Code in die Schleife einfügen, in der Ansicht, aber ich denke, es ist schrecklich.

Muss ich einen Helfer dafür verwenden und die Funktion aus der Ansicht aufrufen?

Vielen Dank im Voraus,

- ARemesal

Antwort

42

Wenn Sie eine Tabelle haben und Daten aus einer anderen Tabelle abrufen möchten, ist dies in der Regel eine has_many Beziehung. Zum Beispiel haben wir @people (Person Modell), und jede Person has_many Adressen (Address Modell). In diesen Fällen sind die beste Sache ist dies

# Controller 
@people = Person.find(:all, :include => :addresses) 
... 

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 

Wenn Sie Ihre Daten nicht nur normale Datenbanktabellen (vielleicht haben Sie es von einem Web-Service oder so bekommen) zu tun, dann ist eine gute Sache zu tun, alles zu bauen die Daten im Controller vor der Zeit, dann an die Ansicht übergeben. So etwas wie dieses

# Controller 
@people = Person.find(:all) 
@people.each do |p| 
    # attach loaded data to the person object in controller 
    p.addresses = Address.load_from_somewhere_by_name(p.name) 
... 

diese Weise wird die Ansicht Code sauber bleibt, wie folgt aus:

# View 
@people.each do |p| 
    p.addresses.each do |address| 
    ... 
+0

Für meine Zwecke, ich denke, das ist die beste Lösung. Danke Orion für einen Tipp, der mir viele neue Ideen gegeben hat :) – ARemesal

1

Es ist ziemlich schwer, über beste Lösung für Ihr Problem ohne Einzelheiten zu Daten und Beziehungen zwischen den Modellen (Tabellen) zu erzählen. Die gemeinsame Idee ist als nächstes: Halten Sie Ihre Ansichten dumm. Erhalten Sie alle Daten, die zum Rendern der Ansicht in Ihrer Controller-Aktion benötigt werden. Nehmen Sie alle Änderungen und Berechnungen innerhalb derselben Aktion vor. Dann nutzen Sie diese Daten.

BTW, wenn Sie über N + 1 Problem sprechen dann lesen Sie mehr über "include" und "Joins" ActiveRecord Parameter.

0
  • der gesamte Logik auf Ihrem @dataset Artikel Halten Sie in der Controller-Aktion
  • mit anderem Modell für die Interaktion in Ihren Modellen Verfahren verwenden Objekte, die Sie benötigen
  • Sie mit nur @dataset für Ihre Ansicht überlassen werden sollen das du in einem Teil rendern kannst.

Sie müssten Ihre Situation weiter erklären, um weitere Antworten zu erhalten. Mit welchen Operationen und anderen Modellen müssen Sie interagieren? Wenn Sie Ihre Modellverknüpfungen veröffentlichen, sind wir uns sicher, dass wir Sie wirklich wegstecken können.

Viel Glück!

1

Wenn ich Sie wäre, würde ich eine separate Klasse erstellen, die den Datensatz kapselt und die gesamte Logik enthält, die bei der Verarbeitung der Datensatzeinträge eine Rolle spielt. Diese Klasse könnte iterierbar sein (auf jede antworten). Dann würde ich eine Instanz dieser Klasse an die Ansicht übergeben und dort nur ihre Methoden verwenden.

+0

Ich denke, es ist eine gute und schöne Lösung, aber es ist zu komplex für meine Bedürfnisse in diesem Fall. Ich werde es für die Zukunft kommentieren :) – ARemesal

1
Person(id, name, other fields...) 
Event(id, title, ...) 
Date(id, date, time, event_id, ...) 
Disponibility(id, percent, date_id, person_id, ...) 

Natürlich alle Beziehungen im Modell definiert sind.

Ich habe eine Ansicht, die alle Termine für eine Veranstaltung zeigt, ist es einfach. Aber ich möchte für jedes Datum die Daten für alle Personen drucken, die für dieses Datum verfügbar sind. Meiner Ansicht nach, zu vergessen, MVC-Entwurfsmuster, könnte ich so etwas wie dieser Code:

<% for date in @Dates 
    available = Disponibility.find_by_date_id(date.id) 
    for item in available 
    guy = Person.find_by_id(item.person_id) 
%> 

Render Datum und Personen zur Verfügung ...

mag ich dies in der Ansicht zu vermeiden. Ich denke, die Antwort von Orion Edwards ist die nächste für das, was ich brauche, aber in diesem Beispiel ist die Adresse ein leeres Feld für die Personentabelle. Oder wie kann ich der Klasse Person ein neues Attribut hinzufügen?

Obwohl, ich vermisse einen SQL-Trick für dies tun?

Verwandte Themen