2010-12-10 2 views
1

J'ai trois tables: les utilisateurs, les événements et user_events, alors je fais ce qui suit dans le contrôleur:ROR: sélectionnez des tables multiplt avec .each ne

@temp = UserEvent.where(['user_id = ?', session[:uid]]).all 
    @temp.each do |t| 
     @event_names = Event.where(['id = ?', t.event_id]).all 
    end 

mais il finit par sauver seulement le dernier événement apparié . Où ai-je tort?

Répondre

3

Tout d'abord, la solution à court terme:

@event_names = UserEvent.where(['user_id = ?', session[:uid]]).all.map do |t| 
    Event.where(['id = ?', t.event_id]).all 
end.flatten 

Maintenant, la solution à long terme:

@user = User.find(params[:id]) 
@user.events 

Pour obtenir ce qui précède au travail, vous devez faire 2 choses:

  1. Configurez correctement vos associations. Il semble que vous avez besoin d'une has_many :through association:

    class User 
        has_many :user_events 
        has_many :events, :through => :user_events 
    end 
    
    
    class UserEvent 
        belongs_to :user 
        belongs_to :event 
    end 
    
    
    class Event 
        has_many :user_events 
        has_many :users, :through => :user_events 
    end 
    
  2. mis en place dans nested resource routesconfig/routes.rb:

    resources :users do 
        resources :events 
    end 
    

Je vous conseille vivement de regarder la solution à long terme. Si vous optez pour la solution à court terme, vous manquez une grande partie des avantages que les rails peuvent vous offrir!

+0

Merci beaucoup! Ça aide. – Niao

+0

Heureux que c'était utile. Au début, il peut être difficile d'apprendre la «manière de rail» de la programmation, mais tout ce que vous avez à faire est de travailler pendant quelques semaines. Ces sites peuvent être très utiles: http://rubyonrails.org/, http://railscasts.com/ et http://railsforzombies.org/. – bowsersenior

0

Faites une carte, au lieu de chaque:

@event_names = @temp.map do |t| 
    Event.where(:id => t.event_id).all 
end 

Mais @bowsersenior a raison: utiliser les relations propres à laisser rails faire la bonne chose. Est plus efficace aussi, car il fera seulement 2 requêtes au lieu de N + 1.

class UserEvent < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :event 
end 

class User < ActiveRecord::Base 
    has_many :user_events 
    has_many :events, :through => :user_events 
end 

@events = User.find(session[:uid]).events 
@event_names = @events.map(&:name) # for example 
0

Qu'est-ce qui n'a pas fonctionné?

@temp.each do |t| 
    @event_names = Event.where(['id = ?', t.event_id]).all # will reassign @event_name each time 
end 

Vous Réaffectation la variable @event_names chaque fois que vous passez par la boucle et donc les seules valeurs qui @event_names détiendront sont de la dernière passe à travers cette boucle.

Qu'est-ce que vous auriez dû faire:

@temp.each do |t| 
    @event_names.push(Event.where(['id = ?', t.event_id]).all) or 
end  

En outre, comme indiqué par d'autres, ce n'est pas vraiment la meilleure/bonne façon de le faire.

+0

Merci, je vais essayer de faire le meilleur chemin. – Niao

Questions connexes