2011-03-01 8 views
4

두 개의 activerecord 연결간에 데이터를 이전 중이므로 Legacy :: Tablename 및 Tablename에서 읽을 수 있도록 모델을 모두 올바르게 설정하고 새 테이블에 삽입하십시오.ActiveRecord 모델의 속성 삭제

내가 가진 문제는 내 새 모델에 레거시 모델에있는 모든 특성이 없으므로 새 모델에서 레코드를 만들 때 '알 수없는 특성'이 표시된다는 것입니다.

legacy_users = Legacy::User.all 
legacy_users.each do |legacy_user| 
    User.create legacy_user.attributes 
end 

그러나 잘못된 속성을 제거하려고해도 여전히 작동하지 않습니다.

legacy_user.attributes.delete 'some_attribute' 

누구에게도 포인터를 제공 할 수 있습니까?

+0

ActiveRecord를 사용해야합니까, 아니면 일반 오래된 SQL을 사용할 수 있습니까? ActiveRecord 객체를 인스턴스화, 유효성 검사 및 저장하는 대신 데이터베이스에서 직접 데이터를 덤프 /로드하는 것이 훨씬 빠릅니다. – Teoulas

답변

1

이 경우에 작동합니다 :

legacy_users = Legacy::User.all 
legacy_users.each do |legacy_user| 
    u = User.new 

    u.attributes.each do |k, v| 
    old_val = legacy_user.send(k) # Get the attr from old user 
    u.send("#{k}=", old_val) # Set it to the new user 
    end 
end 

당신은 너무

+0

'NameError : 메서드'some_attribute'가 Legacy :: User에 정의되지 않았습니다. –

+0

대체 답변을 게시했습니다! – nvez

+0

네, 그게 효과가 있습니다 - 때로는 애트리뷰트가 새 모델에없는 오래된 모델에 있고 그 반대의 경우도 있기 때문에 답과 Deepak의 조합이 될 것입니다. –

11

각 사용되지 않는 속성을 제거하는 혼란을 통해 갈 필요가 없습니다 얼마나 attributes.except에 대한 (: some_attribute)?

+0

레일 4에서 다음과 같아야합니다. attributes.except ('some_attribute') – Jonas

+0

레일즈 [Hash # except] (http://api.rubyonrails.org/classes/Hash.html#method-except) ] (http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods.html#method-i-attributes)는 해시를 반환합니다. – kangkyu

0

나는 또한 작업을하고 있는데, 제 경우에는 객체를 복제하기 위해 블록을 first_or_create에 전달하고있었습니다. 나는 delete() 또는 except() 동작하지 않습니다 수 있지만, 어떤 이유로이 작동합니다

scrubbed_obj = my_obj.attributes.reject { |k,v| k == 'the_attribute_you_dont_want' }

new_object.attributes = scrubbed_obj

을 다음 블록은 잘 저장합니다. 다른 사람이 유사한 문제를 겪고있는 경우에 대비하여이 대답을 버리는 것입니다.

관련 문제