保存在模型中

时间:2012-01-04 15:46:49

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

我在country.rb中有一个方法,我在其中定义了一个新方法。

class Country < ActiveRecord::Base
  has_many :states, :dependent => :destroy

  after_save :count_total_states

  def count_total_states
    self.duration = State.count(:conditions => { :country_id => self.id })
    Country.save!(:duration => self.duration)
  end
end

我得到了我想要的self.duration结果。但当我跑它时,它说

undefined method 'save!' for #<Class:0x111170d10>

我想让它在每次创建新状态时计算属于该国家/地区的状态数。请告知该怎么做。感谢。

3 个答案:

答案 0 :(得分:2)

只需使用update_column即可。它会跳过回调和验证。以下是update_column上的文档。

此外,states.count已经为您提供查询以按国家/地区查找州。 has_many :states允许您执行此操作。

class Country < ActiveRecord::Base
  has_many :states, :dependent => :destroy

  after_save :count_total_states

  def count_total_states
    update_column(:duration, states.count)
  end
end

答案 1 :(得分:0)

必须是这样的:

def count_total_states
    duration = State.count(:conditions => { :country_id => self.id })
    self.save!(:duration => duration)
end

答案 2 :(得分:0)

这里有几个错误。

  1. 保存!是一个实例方法,所以Country.save!不会工作(国家是一个班级)。
  2. 你正在打电话保存!在由after_save回调触发的方法中,这将导致无限循环。
  3. 更好的解决方案是:

    class Country < ActiveRecord::Base
      has_many :states, :dependent => :destroy
    
      after_create :count_total_states
    
      def count_total_states
        self.duration = State.count(:conditions => { :country_id =>    self.id })
        self.save        
      end
    end
    

    当然,在这种情况下使用before_save回调的另一个好处是你要保存额外的sql(UPDATE ...),否则会在after_save中发生。

    修改

    I want it to count number of states belong to the country everytime a new state is created.
    

    在您的场景中,鉴于上述声明和下面的评论,您必须使用after_create方法。