2010-12-10 20 views
1

を持っています:ユーザー、イベント、およびuser_eventsを、私は、コントローラで次の操作を行います。ROR:.eachとmultipltテーブルから選択し、私は3つのテーブル

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

をそれだけで最後にマッチしたイベントを保存して終了。どこが間違っていたのですか?

答えて

3

まず、短期的な解決策:今すぐ

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

、長期的な解決策:

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

が動作するように上記を取得するには、2つのことをしなければならない。

  1. あなたの関連付けを正しく設定してください。それはあなたが必要とするようになりますhas_many :through associationnested resource routes設定

    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. config/routes.rb中:

    resources :users do 
        resources :events 
    end 
    

私は強くあなたが長期的な解決策を見て促します。短期的な解決策を採用すると、レールが提供しなければならない多くのメリットが失われてしまいます。

+0

ありがとうございます!助けになる。 – Niao

+0

うれしかったのでうれしいです。最初はプログラミングの「方法」を学ぶのは難しいかもしれませんが、あなたがしなければならないことは数週間それで作業することだけです。これらのサイトは非常に役立ちます:http://rubyonrails.org/、http://railscasts.com/、http://railsforzombies.org/ – bowsersenior

0

ではなく、それぞれのマップ、実行します。

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

をしかし、右@bowserseniorです:レールが正しいことをやらせるために適切な関係を使用します。 N + 1ではなく2つのクエリしか実行されないため、効率的です。

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

何が問題になりましたか?

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

あなたは、変数@event_namesあなたがループを通って行くので、@event_namesが保持する値のみが最終パスからそのループをされるたびに再割り当てされています。

は、あなたがやるべきこと:

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

また、他の人が述べたように、これはこれを行うための最良/良い方法は実際にはありません。

+0

ありがとう、私は最善の方法をしようとします。 – Niao

関連する問題