2017-04-12 1 views
0

Ich benutze ein Formular, um einen Benutzer eine neue Überprüfung für die Reisen erstellen, die ein bestimmter Benutzer war. Meine Bewertungen Tabelle haben derzeit die folgenden Spalten (Bewertung, trip_id, Beschreibung). Das Problem, das ich habe, zeigt den Text von Städtenamen von Reisen an, auf denen der Benutzer gewesen ist.Rails: Formular collection_set, help Anzeige von Text durch verknüpfte Tabelle

Rails Doc für collection_set akzeptiert die folgenden Argumente: collection_select (Methode, Sammlung, Wertmethode, Textmethode, Optionen = {}, html_options = {}). In Bezug auf die Textmethode möchte ich den tatsächlichen Städtenamen der Reisen anzeigen können, Stadtnamen werden jedoch von der city_id innerhalb der Reisetabelle referenziert. Ich weiß nicht, wie ich auf diese Spalte zugreifen soll, die über ihre Verknüpfungen existiert.

Tabelle Trips (user_id, city_id) Tabelle City (Name, Beschreibung)

<%= form_for @review do |f| %> 
    <%= f.label :rating %> 
    <%= f.number_field :rating %> <br> 

    <%= f.label :trip_id %> 
    <%= f.collection_select :trip_id, @user.trips, :id, :city_id %> 

    <%= f.label :description %> 
    <%= f.text_area :description %> <br> 

    <%= f.submit %> 
<% end %> 

Mein erstes Mal Schienen Formen fragt nach, so lass es mich wissen, wie ich die Frage zu informieren, um besser zu aktualisieren.

Antwort

1

Anstelle von city_id in der collection_select möchten Sie stattdessen den Namen der Stadt verwenden. Hier ist eine Möglichkeit, es zu tun:

Zum einen fügen city_name zu Trip

class Trip < ActiveRecord::Base 
    belongs_to :city 
    def city_name 
    city.name 
    end 
end 

dann Ihre ändern wählen:

<%= f.collection_select :trip_id, @user.trips.includes(:city), :id, :city_name %> 

Die includes(:city) Bit wird Ihnen helfen, die N + 1 Abfrage Problem zu vermeiden , so dass jeder Trip keinen Datenbankaufruf für City machen wird.

+0

Super !! Genau das habe ich gebraucht. Können Sie erklären, wie die Methode funktioniert, insbesondere wie das Trip-Modell Zugriff auf das Stadtmodell hat. Liegt es daran, dass Sie zuerst die Beziehung "coins_to" einrichten müssen? – jamesvphan

+1

Genau das - Hinzufügen von 'gehört' zu ActiveRecord erkennt, dass' city_id' einer 'Stadt' entspricht, und es wird geladen, wenn Sie auf' city' zugreifen. Die Dokumentation zu Assoziationen erklärt das gut: http://guides.rubyonrails.org/association_basics.html – gwcodes

Verwandte Themen