2012-01-04 3 views
0

새로운 방법을 정의한 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>

말했다. 무엇을해야할지 조언하십시오. 감사.

답변

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 
+0

이유는 내가'after_save'해야 할 이유는 계산을하기 전에 새로운 상태가 저장되었는지 확인하기 위해서입니다. 저장하기 전에 계산을하면 새 상태가 포함되지 않습니다. – Victor

+0

좋아요. 내 예를 업데이트했습니다. –

+0

그것은 여전히 ​​무한 루프를 일으켰습니다 ... – Victor

0

그것은 다음과 같이해야합니다 :

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

이 해결책은 부분적으로 만 정확합니다. 내 대답을 보라. – Shreyas

+0

나는 그것을 실제로 시도했다. 하지만 루비 메모리 누수가 생겨서 무료로 제공되는 모든 램을 빨아 들이고 응답하지 않습니다. – Victor

+0

무한 루프가 발생하기 때문입니다. – Shreyas

0

여기 실수의 커플.

  1. 할인! 인스턴스 메서드이므로 Country.save! 실 거예요 (국가는 클래스입니다).
  2. 저장하고 있습니다. 무한 루프를 일으키는 after_save 콜백에 의해 트리거되는 메소드에서.

더 나은 솔루션은 다음과 같습니다

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와 함께. 위의 문장하고 after_create 방법을 사용해야합니다 아래의 코멘트 주어진 시나리오에서

편집

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

.

+0

이유는 'after_save'를해야하는 이유는 계산을하기 전에 새 상태가 저장되었는지 확인하기 위해서입니다. 저장하기 전에 계산을하면 새 상태가 포함되지 않습니다. – Victor

+0

내가 말한 것처럼 무한 루프가 발생할 수 있기 때문에 시나리오에서 after_save를 사용할 수 없습니다. 내 대답을 업데이트했습니다. before_save를 사용하지 않으려면 after_create를 사용하십시오. – Shreyas

+0

업데이트는 실제로 새로운 상태를 추가 할 수 있기 때문에'after_create : count_total_states'와'after_update : count_total_states'를 함께 사용할 수 있습니까? 사실 그것은 중첩 된 모델입니다. 나는 단지 내 질문에 그것을 단순화. – Victor

관련 문제