Comment puis-je faire named_scope dans les Rails de retourner une valeur au lieu d'un tableau?
Je veux écrire un nommé portée pour obtenir un enregistrement à partir de son id.
Par exemple, j'ai un modèle appelé Event
, et je veux simuler Event.find(id)
avec l'utilisation de named_scope
pour l'avenir de la flexibilité.
J'ai utilisé ce code dans mon modèle:
named_scope :from_id, lambda { |id| {:conditions => ['id= ?', id] } }
et je l'appelle de mes contrôleur comme Event.from_id(id)
. Mais mon problème est qu'il renvoie un tableau de Event
objets au lieu d'un seul objet.
Donc si je veux obtenir le nom de l'événement, je dois écrire
event = Event.from_id(id)
event[0].name
tout ce que je veux, c'est
event = Event.from_id(id)
event.name
Je fais quelque chose de mal ici?
Vous devez vous connecter pour publier un commentaire.
Que Damien mentionne, à l'aide d'une portée personnalisée juste pour les regarder par ID n'est pas recommandé. Mais pour répondre à votre question:
Recherche d'enregistrements avec
named_scope
retournera toujours unActiveRecord::NamedScope::Scope
objet qui se comporte comme un tableau. Si il y a juste un seul enregistrement renvoyé par votre requête, vous pouvez utiliser lefirst
méthode pour obtenir le ActiveRecord objet directement, comme ceci:Dans ce cas, j'aimerais créer une méthode de classe
Un autre exemple:
Méthodes comme ça c'est mieux que named_scope. Vous pouvez appeler
Invoice.number.next
, mieux quenamed_scope
retourInvoice.number[0].next
.Il n'y a pas besoin d'utiliser un champ d'application ici. Vous pourriez faire
Event.find_by_id id
.La différence entre
find
etfind_by_id
est que le premier va soulever uneActiveRecordNotFoundException
si l'enregistrement n'existe pas. La deuxième, on vient de retourner nil.L'écriture d'un champ d'application pour obtenir l'enregistrement par l'id est une très mauvaise id que c'est quelque chose qui est déjà fourni nativement par les rails.
def ... end
); il n'a pas à être une étendue nommée.