2010-01-26 3 views
1

Je suis nouveau à rails et rubis.comment faire une boucle dans une collection et de trouver quelque chose dans les rails

J'ai une association has_many entre l'utilisateur et le magasin

ci-dessous est ce que je fais:

@user = User.find_by_userid_and_password("someuser", "12345") 
=> #<User id: 1, userid: "someuser", password: "12345", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00"> 
@user.stores 
=> [#<Store id: 3, store_id: 3, store_name: "New Store 2", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00">, 
#<Store id: 5, store_id: 5, store_name: "Store 14th and M", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00">] 

donc en gros je suis d'abord authentifie l'utilisateur et obtenir tous les magasins qui appartient un utilisateur. Pour cela, je reçois une liste. Dans cette liste de hashes je veux savoir si quelque chose est là avec store_id == 4.

séquentielle je:

@user.stores.first.store_id==4 
false 
@user.stores.second.store_id==4 
false 

comment puis-je faire cela dans une boucle? et y a-t-il une meilleure façon de le faire.

Répondre

6

Bienvenue sur Rails,

Votre meilleure approche ici est sans doute de ne pas utiliser une boucle, mais à la chaîne une découverte à votre premier viseur.

Par exemple:

@user.stores.find(store_id)

Cela db et tirer parti de la beaucoup plus rapide.

Vérifiez la API

Si vous ne voulez boucle vous faites quelque chose comme ce qui suit

@user.stores.each do |store| 
    @my_store = store if store.id == store_id 
end 

ou

@my_store = @user.stores.select{|s| s.id == store_id}

ou

@contains_store = @user.stores.include?{|s| s.id == store_id}

Bonne chance,

+0

Merci. si je fais '@ user.stores.find (6)' puisque 6 n'est pas l'un des id il renvoie une erreur. Comment pourrais-je mettre cela dans une condition si alors? 'if @ user.stores.find (6)! = nil ...' est-ce correct? – mustaine

+0

Vous pouvez faire find_by_id (6) qui retournera un tableau (aucune erreur ne sera levée) et ensuite vérifier pour nil. @ user.stores.find_by_id (6) .first.nil? – Jonathan

+1

Puisque nil est faux dans Ruby, vous pouvez simplement faire 'if @ user.stores.find (6) ...', vous n'avez pas besoin de comparer manuellement à zéro puisque vous êtes en train de courir avec une expression vrai/faux . – Eric

Questions connexes