rails has_many:通过表格没有保存

时间:2011-02-16 11:10:06

标签: ruby-on-rails associations models

我是rails的新手,所以要小心丑陋的代码。 我有这些模型

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”等。 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

现在,问题是: playing.save给了我没有错误。

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

将“打印”正确的数据,但不会保存在数据库中!我使用sqlitebrowser进行目测检查,我确信它没有保存。

顺便说一下,作为第二个问题,如果有人知道如何在没有上述丑陋代码的情况下获得关联对象,也非常感谢。

以及第三个也是最后一个问题:

steps = []   playing.steps.split(“;”)。每个{| a |步骤&lt;&lt; a.split( “:”)。第一}

这也很可怕,但不知道如何让它变得更好(想要从aa获得aa和bb:cc; bb:dd;“我不知道什么是aa和bb,它可以是数字或单词。

1 个答案:

答案 0 :(得分:1)

如果您想在save失败时提出异常,请致电save!;否则,如果继续使用save,则应检查返回的布尔值以查看保存是否成功。

false返回值表示验证失败。故障的详细信息将在模型的错误信息中。


关于以更好的方式获得关联:您可以使用范围甚至只是通过编写方法来封装您尝试执行的操作。


关于解码步骤,您可以使用inject而不是each,但它仍然会非常沉重。我建议将其封装在一个带有描述性名称的方法中,例如decode_steps或类似的。