2009-12-30 5 views
0

나는 내가 다음과 같은 작업을해야 주장을 사용하고모델의 속성 값은 어떻게 변경합니까?

ActiveRecord::Base.establish_connection(:adapter => 'mysql', :database => 'development', :username => 'appAccount', :password => '------', :socket => '/tmp/mysql.sock') 

class ProcessQueue < ActiveRecord::Base 
end 

튜토리얼 다음 스크립트를 가지고있다.

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'") 
updateQ.ExIfQ = 1 
updateQ.save 

updateQ는 다음과 같은 데이터

ProcessQueue id: 104, photoID: 234, ExIfQ: 0, Providor: 0, created_at: "2009-12-30 14:42:01", updated_at: "2009-12-30 14:42:01"

하지만이 방법은

NoMethodError 존재하지 않는 말하는 오류가 발생 updateQ.ExIfQ = 1을 실행이 : 정의되지 않은 방법을 'ExIfQ=' for #<Array:0x102207c60>

오류는 의미가 있습니다. 배열을 변경하려고합니다. 따라서 나는 틀렸거나 튜토리얼이 잘못되었다고 가정 할 수 있습니다 :)

누군가이 업데이트를 어떻게 작성해야하는지 궁금한가요?

p.s 이것은 내 레일 애플리케이션에서 실행되는 백그라운드 스크립트입니다. 만 쿼리 결과 이들 중 하나가있을 것입니다 경우

감사

+0

나는 당신이하려는 것을 완전히 이해하지 못합니다. ProcessQueue.find (: all, ...)는 ProcessQueue 객체의 배열을 반환하므로 배열에서 객체를 추출하지 않고 객체 속성을 설정하고 저장할 수 없습니다. –

답변

2

를 반복 :

당신은 first를 추가 할 수 있습니다.

ProcessQueue.find(:all, :conditions => { :photoID => 234 }).each do |pq| 
    pq.ExIfQ = 1 
    pq.save! 
end 

하나를 찾아 그것을 직접 처리 : 모든 발견하여 발견을 통해

ProcessQueue.update_all('ExIfQ=1', :photoID => 234) 

으로 반복 :

신속하고 더러운 방법은 속성을 재 할당 update_all을 사용하는 것입니다

if (pq = ProcessQueue.find_by_photoID(234)) 
    pq.ExIfQ = 1 
    pq.save! 
end 

참고로 배열을 사용하여 선언 할 때 조건을 설명하지 마십시오. 자리 표시 자 또는 해시 스타일. 필요에 따라 유형 변환을 수행하므로 훨씬 안전합니다.

1

는 사용

updateQ = ProcessQueue.find(:first, :conditions => "photoID = '234'") 
+1

나는 아래 표를 이해하지 못합니다. OP 코드에서 다음을 대체하면 모두 :이 답변에서 언급 한 것처럼 코드가 작동합니다. – nathanvda

1

find 방법은 객체의 배열을 반환합니다.

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'").first 

를 다음 예는 작동, 또는 배열 자신의 여러 단점이 그 일을 몇 가지 방법, 각있다

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'") 
updateQ.each do |u| 
    up.ExIfQ = 1 
    up.save 
end 
관련 문제