2011-02-16 7 views
0

私はレールに慣れていないので、醜いコードに注意してください。 私はレールhas_many:throughテーブルは保存されません

class User < ActiveRecord::Base 
has_many :games_playeds 
has_many :games, :through => :games_playeds 

end 

class Game < ActiveRecord::Base 
    has_many :games_playeds 
    has_many :users, :through => :games_playeds 

end 

class GamesPlayed < ActiveRecord::Base 
    validates_presence_of :user_id, :game_id 
    belongs_to :user 
    belongs_to :game 

end 

ゲームは、任意のユーザ GamesPlayedの独立したゲームは、ユーザーがそのゲームに(死亡、現段階、勝利、など)を振る舞っ方法について説明し記述するこれらのモデルを持っている

このゲームの各段階において、ユーザーはいくつかの選択肢の中から選ぶことができ、後の段階に入るものもあれば、戻ってくるものもあります。要点は、選択が一段階で行われると、私は何か他のものを選ぶことを許さないということです。 これを実装するには、「0:1; 1:6; 6:2」などの前の選択をエンコードするsteps属性があります。 GamesPlayedモデルのこの属性。

ユーザーがナビゲートするページは自動的に生成されるため、名前はわかりませんが、XX_to_YYと呼ばれています。

 #get the game name, we have several games 
     game = Game.find_by_name (params[:game]) 
     #get the previous and current stage 
     from, to = params[:page].to_s.split("_to_")  
     to = to.split(".html")[0] 

     played = current_user.games_playeds.find_by_game_id (game.id) 

     steps = [] 
     played.steps.split(";").each {|a| steps << a.split(":").first} 
     if steps.include? from 
     render :inline => "You already chose for this, go back" 
     else   
     played.steps << "#{from}:#{to};" 
     played.save 
#  pl = current_user.games_playeds.find_by_game_id (game.id) 
#  raise pl.steps 
     render "games/choosePath/#{game.name}/#{params[:page]}.html" 
     end 

私はそれは恐ろしいコードを推測:私はそれらすべてを取得し、これほど醜い何かをするだろう、私のコントローラのメソッドを持っています。私はRubyについても新しいです:P

今質問: plays.saveは私にエラーを与えません。

#  pl = current_user.games_playeds.find_by_game_id (game.id) 
#  raise pl.steps 

は正しいデータを「印刷」しますが、データベースには保存されません。私は視覚的にそれを検査するためにsqlitebrowserを使用し、私はそれが保存されていないと確信しています。

BTWは、第2の質問として、誰かが非常に感謝の上にその醜いコードなしで関連オブジェクトに到達する方法を知っている場合。

第3および最後の質問:

手順= [] played.steps.split( ";")は、各{| |。 BB; CC::。これも恐ろしいですが、それが良い(AA」からAAとBBを取得したいようにする方法がわからない最初}

:< < a.splitを( "")、ステップDD。 「私はAAとBBが何であるかを知らない、それは数字や単語ことができ

答えて

1

あなたはsaveが失敗した場合に例外を発生させたい場合は、save!を呼び出す;。あなたはsaveを引き続き使用する場合はそうでなければ、返されたブール値をチェックする必要があります保存が成功したかどうかを確認します。

false戻り値は、検証に失敗したことを示します。モデルに関する情報より良い方法で関連付けを得ることについて


:あなたが何をしようとするカプセル化する方法を書くことによってだけでもスコープかで行うことができます何かが、おそらくそこにあります。手順をデコードに関しては


、あなたの代わりにeachinjectを使用することができますが、それはまだかなりロジック重いだろう。 decode_stepsなどのようなわかりやすい名前のメソッドでカプセル化することをお勧めします。

+0

保存しました。しかし、例外は発生しません。 – Jordi

+0

そして保存は "true"を返す – Jordi

+0

'played.steps <<"#を{from}に変更してみてください:#{to}; "' 'playing.steps = played.steps +"#{from} :#{to}; "それが違いを生むかどうかを確認するだけです。また、レールコンソールでこれを作り直して、セーブが起こっていない理由をもっと知ることもできます。 –