我在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>
我想让它在每次创建新状态时计算属于该国家/地区的状态数。请告知该怎么做。感谢。
答案 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)
这里有几个错误。
更好的解决方案是:
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方法。