Ruby 为什么可以';我不能在Rails 3.0.7中调用self.save吗?

Ruby 为什么可以';我不能在Rails 3.0.7中调用self.save吗?,ruby,ruby-on-rails-3,activerecord,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.

在我的模型中调用方法时,我想更新一个名为“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
为什么第二个有效而第一个无效?有更好的方法吗?

该函数将更新保存到数据库(无需验证),因此调用
update\u属性和
save
的方法没有多大意义

但是我还是不明白你为什么会犯这样的错误。你能试试这个吗

def start
    self.started = true
    self.save
end
该函数将更新保存到数据库(无需验证),因此按您的方式调用
update\u属性
save
没有多大意义

但是我还是不明白你为什么会犯这样的错误。你能试试这个吗

def start
    self.started = true
    self.save
end

我要把我对你说过的话贴在这里

22:55重新找到对象并保存它的事实对我来说似乎意味着错误来自您在startGame方法中对对象所做的操作
22:55在Ruby中,我自己实际上不是同一个对象;它是根据相同数据初始化的新实例
22:55但它没有您在方法中所做的任何更改,因为它们没有保存
22:55所以我真的知道为什么会这样


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

我只想把我对你说过的话粘贴到这里

22:55重新找到对象并保存它的事实对我来说似乎意味着错误来自您在startGame方法中对对象所做的操作
22:55在Ruby中,我自己实际上不是同一个对象;它是根据相同数据初始化的新实例
22:55但它没有您在方法中所做的任何更改,因为它们没有保存
22:55所以我真的知道为什么会这样


所以,我们知道的很多。我认为,你需要透露更多的StartName方法来确定真正的问题。

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

正因为如此,
self
的保存工作搞砸了


正如Eris所说,第二种方法之所以有效,是因为我没有将错误的更改保存到
self

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

正因为如此,
self
的保存工作搞砸了


正如Eris所说,第二种方法之所以有效,是因为我没有将错误的更改保存到
self

呃,这是我实际上知道但忘记的事情。谢谢你指出这一点!谢谢你的提示,尽管错误仍然存在。我为
startGame
添加了完整的代码,我想知道序列化的territory\u所有者是否是真正的问题。您是否尝试将
update\u属性(:start,true)
替换为
self.start=true
?你确定你仍然会犯同样的错误,因为那会很奇怪。呃,这是我实际上知道但忘记了的事情。谢谢你指出这一点!谢谢你的提示,尽管错误仍然存在。我为
startGame
添加了完整的代码,我想知道序列化的territory\u所有者是否是真正的问题。您是否尝试将
update\u属性(:start,true)
替换为
self.start=true
?你确定你仍然会得到同样的错误,因为那会很奇怪。