Bonjour,

Je voudrais savoir si il y avait une meilleur façon d'afficher un attribut provenant d'une association.

Voici le code de mon premier modèle

class Model1 < ApplicationRecord
  has_many :model2
end

Voici le code de mon deuxieme modèle

class Model2 < ApplicationRecord

  has_one :model1

  def get_name
    Model1.find(model1_id).name
  end

end

Et ma vue

<%= model2.get_name %>

Y-a t'il une meilleur façon de traiter cet affichage ?
PS: RAILS 5

4 réponses


kal-el
Réponse acceptée

Tu n'as pas besoin de manuellement trouver l'enregistrement associé, ApplicationRecord le fera pour toi. Tu as déjà définit la relation has_one :model1. Tout ce que tu as à faire est de l'appeler depuis une instance de Model2:

<%= model2.model1.name %>

Tu peux aussi utiliser la délégation (Loi de Déméter , bien qu'inutile dans ce cas précis) pour avoir un équivalent de ce que tu voulais au niveau de l'appel:

class Model2 < ApplicationRecord
  has_one :model1

  delegate :name, to: :model1, prefix: true
end

Ce qui te permet de récupérer le nom de model1 comme ceci:

<%= model2.model1_name %>
keilo
Auteur

Merci de ta réponse, j'ai cependant un problème : l'affichage dans ma vue en passant par model2.model1.name fonctionne uniquement si j'ai une relation de type belongs_to mais ne fonctionne pas avec has_one dans mon Model2
Sais-tu à quoi c'est dû ?

Le problème doit venir de la structure de ta base de donnée. Je te renvoi à la documentation officielle pour plus d'info http://guides.rubyonrails.org/association_basics.html#the-has-one-association

A quoi ressemble ta base de donnée (pour ce cas)?

keilo
Auteur

Problème résolu merci :)