2016-04-20 7 views
0

Ich versuche, Daten aus zwei Modellen in derselben Tabelle einer Ansicht ohne Join-Tabelle zu verwenden.Suchwert aus Tabelle basierend auf Attribut aus separater Tabelle in Rails 4

Ich möchte eine Game_id und Score von der Punkte Tabelle zeigen. In einer dritten Spalte, möchte ich die game_id von Punkte verwenden den Wert in der Name Spalte des Spiel Modellanpassungskompensator selben ID von Punkte nachzuschlagen.

Im ScoreboardController, die auf dieser Tabelle gelten, ich versuche zuerst eine Reihe von Points zu wählen und dann die ID-Abfrage:

@points = Point.where(user_id: current_user.id).order(game_id: :desc) 
    @find = @points.pluck(:game_id).last 
    @game = Game.where(id: @find) 

Ok, so werde ich die vollständige Liste anzuzeigen von @points, die eine id ganze Zahl für game_id enthält. Ich versuche dann, passendes Spiel mit @game nachzuschlagen.

Als nächstes möchte ich dies in einer Tabelle mit der dritten Spalte zeigen die .name aus der Zeile in @game auswählen.

<tbody> 
     <% @points.each do |point| %> 
     <tr> 
      <td><%= point.game_id %></td> 
      <td><%= point.virtualmoney %></td> 
      <% @game.each do |game| %> 
       <td><%= game.name %> 
      <% end %> 
     <% end %> 
     </tr> 
    </tbody> 

Diese richtig zeigt Reihen aller game_ids in den Punkte Modell mit virtualmoney für dieses Spiel verdient. Ich versuche dann eine zweite Iterationsschleife mit game.name - es lädt, aber es gibt grundsätzlich den ersten Wert für jede einzelne Zeile.

Also statt "ID: 1 | Währung: 5 | Name:" Spiel 1 "... ID: 2 | Währung: 3 | Name:" Spiel 2 ", es wäre nur" Spiel 1 "," Spiel 1" , und so weiter)

Was soll ich für jede Zeile einen Namen zurückzukehren zurückzukehren tun, um die game_id in der ersten Spalte passende

EDIT:.? schema.rb SNIPPET

create_table "games", force: true do |t| 
    t.string "name" 
    t.integer "max_players" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

create_table "points", force: true do |t| 
    t.integer "game_id" 
    t.integer "user_id" 
    t.integer "points", default: 0 
    end 
+0

Können Sie Ihre schema.rb hinzufügen? – max

+0

@max Guter Punkt, nur hinzugefügt – darkginger

+0

Können Sie Modelle hinzufügen, damit wir prüfen können, ob die Verknüpfungen korrekt sind? –

Antwort

1

Wenn Sie richtigen Assoziationen haben, wird Folgendes Ihren Bedarf dienen:

<tbody> 
    <% @points.each do |point| %> 
     <tr> 
     <td><%= point.game_id %></td> 
     <td><%= point.virtualmoney %></td> 
     <td><%= point.game.name %></td> 
     </tr> 
    <% end %> 
</tbody> 

Die Sache ist die, Game has_many Punkte und Punkt belongs_to ein Spiel. So können Sie den zugehörigen Spielnamen von Ihrem Punktobjekt erhalten - point.game.name. Dies verletzt zwar das Demeter-Gesetz, aber es wird tun, was Sie brauchen.

0

Ich verstehe nicht vollständig, was Sie tun wollen, aber hoffentlich th Die folgenden Punkte können helfen. Wenn ich verstehe nichts richtig die folgenden Zeilen zu tun:

<% @game.each do |game| %> 
    <td><%= game.name %> 
<% end %> 

weil ...

@find = @points.pluck(:game_id).last 
##Will return only one Game id (e.g. 1) 

@game = Game.where(id: @find) 
## Will return a ActiveRecord Collection with only one game. 

In diesem Fall können Sie auch besser dran mit:

@game = Game.find(@find) 

Dies entspricht zu rufen:

@game = Game.where(id: @find).first 

Wenn Sie also durch @game iterieren, durchlaufen Sie einfach eine ActiveRecord-Sammlung, die nur 1 Element enthält.

Die von Ihnen hinzugefügten Grundzuordnungen würden helfen, besser zu verstehen.

Verwandte Themen