2011-02-05 5 views
0

그래서 많은 RSS 피드를 가져 와서 테이블에 저장하는 애플리케이션이 있습니다. 조건에 대한 각 항목의 몇 가지 사항을 확인한 다음 조건에 따라 속성을 설정합니다.모델의 속성 설정

if self.value1 > self.value2 then 
    :status => 'foo' 
else 
    :status => 'bar' 
end 

나는 아직도 루비/레일과 멍청한 놈과 상태를 설정하면 예외를 일으키는 조금 해요 그러나 나는 이유를 알지 못한다.

도움이 될 것입니다.

+1

당신은 self.status = 'foo'를 시도 했습니까? – apneadiving

+0

예. 일하지 않았어. – Synthesezia

답변

3

"속성을 설정합니다"라고 말하면, 이것이 표의 다른 열임을 의미한다고 가정합니다. 그렇다면,이 작업을해야합니다 :

if self.value1 > self.value2 
    update_attribute :status, "foo" 
else 
    update_attribute :status, "bar" 
end 

객체를 인스턴스화 할 때, 또는 하나 개 이상의 속성 (self.update_attributes :animal => "kitten", :sound => "Roar!")를 업데이트 할 때 "로켓"표기법 (:this => "that")가 사용된다. Hash이 사용하는 표기법입니다.

status = "foo"을 사용할 수도 있지만 저장하지 않고 속성을 설정하므로 self.save으로 전화해야합니다. update_attribute은 모두 하나의 깔끔한 패키지로 제공됩니다.

+0

또한,'update_attribute'에 대한 검증은 일어나지 않을 것입니다; 유효성 검사를 실행하고 싶다면''update_attributes''를 "s"와 함께 사용하십시오. [그것을 확인하십시오] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#validations-overview). – chadoh

0

에서 레일 4 나는 다음과 같은 방법으로 수행 한 :

def update_test 
    if self.value1 > self.value2 
     self.status="foo" 
    else 
     self.status= "bar" 
    end 
end 

을 모델에 before_update 필터를 추가했다.

before_update :update_test, :if => :test_changed? 

이 메서드에서는 save 또는 update_attributes를 호출 할 필요가 없으며 이는 단일 쿼리에서 수행됩니다.

+0

이것은 거의 3 년 전이었습니다. 더 이상 도움이 필요하지 않습니다. – Synthesezia

+0

누군가이 스 니펫을 작성하는 데 도움을받을 수 있다면 추가했습니다. – Baran