为什么我不能在Rails 3.0.7中调用self.save?

时间:2011-07-15 02:50:59

标签: ruby ruby-on-rails-3 activerecord

在我的模型中调用方法时,我想更新一个名为“started”的字段。这似乎很简单,但是:

这打破了:

has_many :terra_players, :dependent => :destroy

serialize :territory_owners

class SomeGame < ActiveRecord::Base


  def startGame
    self.territory_owners = []

    self.terra_players.each do |i|
      i.update_attributes(:my_turn => true, :army_pool => 35)
    end

    #give each player maxterritory number of territories


    max_territories = 42 / self.terra_players.length 
    spare_territories = 42 % self.terra_players.length 

    for i in (0..42-spare_territories-1) #bleh
      # pick a random player, make sure they still need territories
      player = nil
      while (true) do
        player = self.terra_players.sample
        if player.num_territories < max_territories
          break
        end
      end
      self.territory_owners.push([player, 1]) #hash instead maybe?
      # make sure player gets updated too
      player.num_territories += 1
      player.save
    end


    if spare_territories != 0
      j = 0
      for k in (i+1..42-1)
        player = self.terra_players[j]
        j += 1
        self.territory_owners.push([player, 1]) #hash instead maybe?

        player.num_territories += 1
        player.save
      end
    end
    self.update_attribute(:started, true)
    self.save
  end

我明白了:

  

TerraPlayersController中的ArgumentError #create

     

错误的参数数量(2为0)

self.update_attribute(:started, true)行。

然而这似乎有效:

class SomeGame < ActiveRecord::Base

  def startGame

        ...

    myself = TerraGame.find(self.id)
    myself.update_attribute(:started, true)
    myself.save
  end

为什么第二个工作但不是第一个工作?我有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

update_attribute函数将更新保存到数据库(没有验证),因此按照您的方式调用update_attribute AND save没有多大意义。

但是我仍然不明白为什么你会收到这个错误。你可以尝试一下吗?

def start
    self.started = true
    self.save
end

答案 1 :(得分:1)

我要贴在这里,就是我已经说过的了。

  22:55重新找到对象并保存它的事实似乎暗示我错误来自你在startGame方法中对对象所做的事情   22:55我自己实际上并不是Ruby中的同一个对象;它是从相同数据初始化的新实例
  22:55但是它没有你在方法中做出的任何改变,因为它们没有被保存   22:55所以,我确实知道为什么会有效

所以,我们知道的很多。我想你需要透露更多的startGame方法来识别真正的问题。

答案 2 :(得分:0)

我已经弄明白了这个问题。我的序列化属性需要在保存/使用期间进行编码和解码。

正因为如此,self的豁免正在搞砸。

正如埃里斯所说,第二种方式才有效,因为我没有将错误的更改保存到self