2017-06-23 1 views
0

Je suis très nouveau sur les rails et j'ai fait une application de base avec deux tables mais je n'ai pas compris comment montrer la valeur de la table référencée au lieu de l'id. Mes deux tables sont Genres et Songs et ressemblent à ceci.Comment afficher les valeurs des tables référencées dans des rails?

id | trackgenre |   created_at   |   updated_at   
----+-------------+----------------------------+------------------------- 

    1 | Classic | 2017-06-13 02:37:07.041974 | 2017-06-13 02:37:07.041974 

    2 | Rock  | 2017-06-13 02:37:07.060634 | 2017-06-13 02:37:07.060634 

    3 | Hip-Hop | 2017-06-13 02:37:07.064877 | 2017-06-13 02:37:07.064877 

    4 | Alternative  | 2017-06-13 02:37:07.067473 | 2017-06-13 02:37:07.067473 





    id | songtitle |   artist  |   genre_id   
----+-------------+----------------------------+--------------------------- 

    1 | Loser   | Beck     | 4 

    2 | Jailhouse rock | Elvis Presley  | 2 

    3 | My Way  | Frank Sinatra   | 2 

Mon song.rb ressemble à ceci

class Song < ApplicationRecord 
    belongs_to :genre 
end 

et genre.rb est

class Genre < ApplicationRecord 
    has_many :songs 
end 

Maintenant, quand je suis extraction de données à partir de l'avant, je vois le genre_id au lieu de la valeur. Par exemple, si je récupère le deuxième élément de ma table Songs, je reçois Jailhouse rock, Elvis Presley, 2. Que devrais-je faire pour obtenir la valeur de genre_id qui est "Rock" pour apparaître sur le front end au lieu de ce nombre 2?

Répondre

0

Si vous récupérez le deuxième élément de chansons simplement par

Song.second 

Cela vous donne genre_id qui est dans la table Songs. Si vous voulez le nom du genre ou dans ce cas `trackgenre, vous devrez joindre les tables:

Song.joins(:genre).select("songs.*", "genres.trackgenre").second 

Cela vous donne tous les attributs de Nom du morceau et genre, ce qui signifie genre_id et trackgenre. Si vous ne voulez pas genre_id et juste trackgenre, vous devrez sélectionner les attributs de la chanson.

Song.joins(:genre).select("songs.id", "songs.songtitle", "songs.artist", "genres.trackgenre").second 
+0

Impressionnant. Mais j'ai toujours pensé que les jointures se faisaient à travers des associations quand je les faisais dans les fichiers des modèles ... belongs_to: genre has_many: songs. Ne sont pas ces tables jointes? Désolé si je ressemble à un noob total. Je suppose simplement que les rails font tout pour moi parfois. Et où devrais-je faire la jointure si je voulais le faire pour toutes les chansons de ma base de données? – craftdeer

+0

Les associations belongs_to et has_many définissent essentiellement les méthodes que vous pouvez utiliser pour extraire les attributs de plusieurs tables associées. Rails ne joint pas de tables pour vous jusqu'à ce que vous utilisiez la méthode 'joins'. Après avoir spécifié les associations, Rails vous permet de joindre des tables en utilisant 'joins 'ou' includes'. Pour extraire les attributs de 'Song' et' Genre', vous devrez les joindre. Pour extraire toutes les chansons avec un nom de genre, utilisez la requête ci-dessus et remplacez 'second' par' all'. 'second' vous donne la deuxième chanson,' all' vous donne toutes les chansons. – moyinho20

+0

génial. Merci Monsieur – craftdeer

2

Je n'ai pas compris comment montrer la valeur de la table référencée au lieu de l'ID

Vous avez juste besoin de faire

<%= @song.genre.trackgenre %> 

@song est une instance de Song