2013-07-14 3 views
1

웹 사이트 URL이 포함 된 모델에서 다음 코드를 실행하고 있습니다. 그것은 'www. 모든 URL에서 데이터베이스에 다시 레코드를 저장하십시오. 그러나 변경된 URL이 저장되지 않는 레코드가 있습니다. 콘솔을 통해 .sub 루틴을 테스트했지만 문자열을 변경했지만 변경 내용이 저장되지 않습니다. 당신을 -ActiveRecord가 db에 대한 변경 사항을 다시 저장하지 않습니다

(0.0ms) commit transaction 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 

답변

3

액티브 모델은 장소에 속성을 변경하지 마십시오 :

def strip 
    b = Sites.all 
    b.each do |t| 
    t.url.sub!(/www./, '') 
    t.save 
    end 
end 

는 또한 레일 콘솔에서 직접 위의 코드를 실행하고 (다시, 아무것도 저장되지 않은) 다음과 같이 출력했다 변경 추적을 혼동하고 activerecord는 변경하지 않았다고 생각합니다.

대신 당신은 또한 URL에서 .을 탈출해야하거나 WWW 후 모든 문자와 일치하는 것

t.url = t.url.sub(/www\./,'') 

을한다.

1

시도의 변화 :

t.url.sub!(/www./, '') 

, 변경 액티브 변경하고 생각 만 필드를 추적

t.url= t.url.sub(/www./, '') 

에 업데이트 조항의 일부입니다. sub를 사용하여 t.url을 직접 변경! 필드를 변경된 것으로 표시하지 않습니다 (아마도 Activerecord의 버그 일 수 있습니다).

또 다른 제안은 /www\./으로 패턴을 변경합니다. 어떤 문자와도 일치합니다.

1

열을 업데이트하기 위해 모든 행을 반복하지 마십시오.

def strip 
    Site.update_all('url = REPLACE(url, "www.", "")') 
end 

가 나는 또한 clean_urls!strip에서 모호한 이름을 변경 것 : 나는 더 나은 대안을 건의 할 것입니다.

관련 문제