2012-01-16 6 views
0

私はルビーを試すサッカーゲームを作ろうとしています。団体は以下の通りです:ルビの多対多関係でロールを割り当てるベストプラクティスは何ですか?

Match.rb

class Match < ActiveRecord::Base 
    belongs_to :home_user, :class_name => 'User', :foreign_key => 'home_user_id' 
    belongs_to :away_user, :class_name => 'User', :foreign_key => 'away_user_id' 

User.rb

class User < ActiveRecord::Base 
    has_many :home_matches, :class_name => 'Match', :foreign_key => 'home_user_id' 
    has_many :away_matches, :class_name => 'Match', :foreign_key => 'away_user_id' 

私の質問は、私は試合のためにhome_userとaway_userを割り当てることができる方法ですか?私は次のように初期化する方法を考えた:

def initialize(home_user, away_user) 
    @home_user = User.find(1) 
    @away_user = User.find(2) 
    end 

が、一致することを決定するユーザーと一致することを申し出た利用者を見つけるためにコードを配置する方法?ユーザが「set_match」リンクをクリックしてこれらのuser_idsをメソッドに送信する瞬間にそれらを定義する必要があると思いますが、どのようにしたらよいでしょうか?問題は、ルビーが私が学んでいる最初のOOLだということです。私はすでにクラスとオブジェクトとカプセル化と変数などを学んだが、メソッドについてのさらなるガイダンスが必要である。前もって感謝します。

答えて

1

あなたのモデルがActiveRecord :: Baseをサブクラス化するときに、すべての属性を設定するための良い初期化メソッドがあるので、私はinitializeメソッドを使用しません。

ただし、このようなことができます。

コントローラ内で次に
def set_users(home_user, away_user) 
    if home_user && away_user 
    self.home_user = User.find(home_user) 
    self.away_user = User.find(away_user) 
    true 
    else 
    false 
    end 
end 

def update 
    @match = Match.find(params[:id]) 
    if @match.set_users(params[:home_user_id], params[:away_user_id]) 
    @match.save 
    else 
    @match.update_attributes(params[:match]) 
    end 
end 

私は基本的にとてもマッチコントローラ上の更新アクションは、ユーザーとの関係を更新するためのオプションを受け入れる、または単に更新パラメータの通常のハッシュを受け入れるそれを設定。

+0

タイプミスはありますか? 'self.home_user = User.find(home_user)'の代わりに 'self.home_user = User.find(home_user_id)'になるべきではありませんか?それにもかかわらず、私は構文を取得します。どうもありがとうございました。しかし最後の質問です:なぜ、作成メソッドや新しいメソッドの代わりに更新メソッドを使用しましたか?新しいメソッドと作成メソッド(とコールバック)の違いは私にとっては複雑です。 – barerd

+0

私はhome_userとaway_userという名前の変数を持っているので、うまくいきます。それらはfindメソッドに渡されています。それらの名前を_idに変更すると、おそらくもっと意味があります。私は試合が存在するという前提で行動した。新しいものを作成しているときに同時にユーザーを選択する場合は、足場の後にデフォルトの作成アクションを使用することができます。実際には、home_user_idと:away_user_idのようにフィールド名を渡す限り、アップデートをデフォルトのままにすることもできます。私は、オブジェクト自体を割り当てる方法を示したかっただけです。 – agmcleod

+0

この遅い応答に申し訳ありませんが、私はアップデートの内容を理解していると思うが、def_setersの中のaway_user_idを誤解していると思う。 'self.away_user_id = User.find(away_user)'の場合、相手の選択ビューの@away_user_idインスタンス変数に他のユーザーの(相手の)IDを割り当てる方法を見つける必要があります(/ new.html.erbと一致しますつまり、コントローラのアップデートや新しいメソッドを呼び出すつもりですか?しかし、マッチ/新規ビューがマッチモデルに属し、ユーザモデルに属さない場合、これはどのようになりますか? – barerd