Rails - vérifier si l'enregistrement existe dans has_many association
Je ne sais pas si ma question est formulée correctement.
J'ai trois modèles: User
, Item
, et UserItem
.
user has_many :user_items
user has_many :items, through :user_items
item has_many :user_items
item has_many :users -> {uniq}, through :user_items
item belongs_to :user
user_item belongs_to :user
user_item belongs_to :item
J'ai besoin d'un moyen de voir si un utilisateur a un élément à prendre if
déclarations de mon point vue, Mais le hic, c'est, user_items ont enum status: [ :pending, approved]
. Donc j'ai besoin de voir si un current_user
a un certain :pending
élément.
Par exemple, lorsqu'un utilisateur visite item1 d'affichage de la page, j'ai le item_controller de l'action show déclarer @item = Item.find_by_id(params[:id])
. Mais alors, que puis-je faire avec cette @item
pour voir si un utilisateur a ce point?
OriginalL'auteur user4584963 | 2016-04-08
Vous devez vous connecter pour publier un commentaire.
Essayer:
Ou
OriginalL'auteur lei liu
Je pense que ce qui vous manque ici est le modèle des méthodes. Par exemple, si vous avez ajouté une méthode à l'Élément de modèle appelé belongs_to_user_in_pending_state, vous seriez en mesure d'appeler
@item.belongs_to_user_in_pending_state(current_user)
partout où vous en avez besoin.1) vous n'avez pas besoin
self
. 2)select
serait de charger l'ensemble de l'attente user_items collection en mémoire avant d'évaluer le bloc, ainsi, avoir des tonnes d'enregistrements dans la collection, il pourrait potentiellement surcharger la mémoire. 3) dans ce cas, vous n'avez pas besoin dereturn
. 4) vous pouvez simplement laisser leuser_items.pending.select {|s| s.user == user}.count > 0
, puisqu'il sera déjà de retour la valeur booléenne. 5) désolé pour la forme de mon premier commentaire, c'était le matin même - toutes mes excusesVous avez parlé d'un "classique" pour ce faire. Ce que ce serait?
par la non conventionnelle je parlais de la mauvaise utilisation des
return
mot-clé ici.1+2 - j'ai pensé que c'était une bonne façon de réduire les besoins de mémoire - nous devrions seulement de l'extraction de l'user_items pour cet article, et seulement ceux qui sont en attente... je n'ai pas connaissance de soi est inutile!! 3) le retour habitude vient de C lorsque j'ai pris comp sci il y a plusieurs années - avant de sortir de la programmation depuis plus d'une décennie. 4) a Été de penser à lui plus compliqué fonctionnalités convenues pour ce cas! 5) Tous les Bons... Merci pour le retour de préciser! Toujours enthousiaste pour apprendre la meilleure façon!
OriginalL'auteur tkz79
1) Ajouter un champ à User_item classe
2) Utilisez cette portée dans une méthode d'instance de la classe Item:
Ensuite, vous pouvez utiliser
je ne pense pas que vous voulez un nombre de requête. si vous êtes simplement à la vérification de l'existence à l'aide de
.exists?
serait de vous donner unSELECT ... LIMIT 1
qui serait arrêter une fois qu'une correspondance a été trouvée.OriginalL'auteur GabrieleF