2014-09-01 2 views
0

나는 다음과 같은 모델이 있습니다는 레일에 이동에 관계 belongs_to 업데이트 할 수 없습니다

Class User::Basic 
    belongs_to: group 

Class Group 
    has_many: users 
    class_name: "::User::Basic", 
    foreign_key: "group_id" 

가 나는 또한 (GROUP_ID -1 동일)

그룹 클래스에 속하는하지 않는 User::Admin 클래스를 가질를

그룹이없는 기존 데이터베이스가 있습니다. 마이그레이션을 통해 기본 사용자 그룹을 편집하려고합니다.

add_column :users, :group_id, :integer, :default => -1 #so that when a group_id is not specified, the user is ranked as admin 

# I create groups 1,2,3 and 4 and then : 

User.find(21, 3, 8, 17, 16, 18, 14, 19, 23, 25, 26).each do |usr| 
    usr.update_attributes(group_id: 2) 
end 
User.find(11, 13, 20, 9).each do |usr| 
    usr.update_attributes(group_id: 1) 
end 
User.find(15,22).each do |usr| 
    usr.update_attributes(group_id: 3) 
end 
User.find(24).update_attributes(group_id: 4) 

을하지만 모든 사용자가 여전히 마이그레이션을 실행 한 후 -1 GROUP_ID이 내 마이그레이션에서

나는 있습니다. 콘솔에서 마지막 비트를 실행하려고 시도했는데 아무도 왜 이것이 마이 그 레이션에서 작동하지 않는지 알 수 있습니까?

+0

시도 다'usr.group_id = 2; usr.save! '. 레코드가 성공적으로 저장되면 true를 반환하고 그렇지 않으면 유효성 검사 오류를 발생시킵니다. – RAJ

+0

나는 그것을 시도하고 유효성 검사 오류가 발생했습니다. – user284130

+0

편집 : 콘솔에서 정상적으로 작동했지만 오류는 발생하지 않았지만 마이그레이션에서는 작동하지 않았습니다. – user284130

답변

1

마이그레이션을 실행할 때마다 레일스는 마이그레이션 파일의 실행 완료 후 테이블에 대한 열 정보를 다시 설정합니다.

경우에 따라 마이그레이션 파일 실행 완료 전에 열에 액세스하려고합니다. 따라서 동일한 마이그레이션 파일에서 방금 추가 한 열에서 작업하기 전에 명시 적으로 reset_column_information에 전화해야합니다. 여기

은 예입니다

def change 
    add_column :users, :name, :string 

    User.reset_column_information 

    User.all.each do |u| 
    u.name = 'user name' 
    u.save! 
    end 
end 
+0

시도했지만 여전히 작동하지 않습니다. 나는 그것이 http://stackoverflow.com/questions/9115347/model-reset-column-information-does-not-reload-columns-in-rails-migration와 같은 열 오류가 없다면 가질 수 있다고 생각한다. 또한 다른 파일에 열을 만들었으므로 아이디어가 효과적이지 않은 이유를 설명 할 수 있습니다. – user284130

2

콘솔

내가 개인적으로 migration의 데이터를 특정 통화를 포함하지 않을

, 그것은 마이그레이션을위한하지 무엇 단지의 :

마이그레이션은 데이터베이스 스키마를이상으로 변경하는 편리한 방법입니다.시간은 일관되고 쉬운 방법입니다. 그들은 Ruby DSL을 사용하므로 스키마를 수동으로 작성하지 않아도되므로 스키마와 변경 사항은 데이터베이스에 독립적입니다. .

각 마이그레이션을 데이터베이스의 새로운 '버전'으로 생각할 수 있습니다. 스키마는 아무 것도 시작하지 않고 시작하며 각 마이그레이션 은 테이블, 열 또는 항목을 추가 또는 제거하기 위해이를 수정합니다. 활성 레코드는이 타임 라인에 따라 스키마를 업데이트하는 방법을 알고 있으므로 이력에있는 모든 지점에서 최신 버전으로 가져옵니다. Active Record는 데이터베이스의 최신 구조 인 과 일치하도록 db/schema.rb 파일을 업데이트합니다.

당신이 청소 문을 사용한다면 나는 그런 등 User.all 등이 언급하지 것입니다,하지만 당신은합니다 (find 방법) 개별 레코드를 선택하고, 당신이 당신의 마이그레이션 아주 데이터를 특정 할 것이다, 이는 어떻게 일 것이다, 그들은 당신이 생산이 밀어 경우

에 대한 것, 다른 ids 무엇을하지?

간단히 는 마이그레이션에 데이터베이스 요청을 수행하지 않는

-

나는 당신의 열을 위해 특별히 마이그레이션을 추천 할 것입니다 : 한 번 그런

#db/migrate/your_migration.rb 
class YourMigration 
    def change 
     add_column :users, :group_id, :integer, :default => -1 
    end 
end 

이 실행되었습니다, 당신은 use the rails console 데이터 특정 수정을 수행하려면 원할 것입니다 원하는 :

레일

groups = {"1" => [11, 13, 20, 9], "2" => [21, 3, 8, 17, 16, 18, 14, 19, 23, 25, 26], "3" => [15,22], "4" => [24]} 

groups.each do |group, users| 
    usr = User.find(users) 
    usr.update_attributes(group_id: group) 
end 
+0

Ok @RichPeck, 귀하의 조언에 감사 드리며, 나는 콘솔에서 모든 것을 다할 것입니다. 데이터 관련 측면에서 필자는 devlopment에 항상 프로덕션 데이터베이스의 마지막 버전을 사용하고 있으므로 dev 및 prod에서 숫자는 동일합니다. – user284130

+0

@ user284130이 변경 사항은 다른 devs 컴퓨터에서 복제 할 수 없습니다. 당신은 레이크 작업을 생성하고 마이그레이션 파일의 끝에 그것을 실행하기위한 인쇄 명령을 내릴 수 있습니다. – RAJ

+0

Thanks @RAJ ... 나는 그것을 시도 할 것입니다. 아직도, 그들은 사용자가 마이그레이션 파일에서 생성 된 객체를 다루고 있기 때문에 수정이'Users'에서 작동하지 않는 이유를 설명 할 수 없습니다. – user284130

관련 문제