3.2

2013-03-02 3 views
2

중요 레일 복합 고유 인덱스와 테이블을 가입 레코드를 추가 할 수 없습니다 SQLite3에서 고유 한 복합 키 인덱스를 사용하여 조인 테이블에 레코드합니다. 내가 한 모든 (수동) 테스트에서 데이터베이스는 db : drop 다음에 db : migrate를 통해 완전히 다시 빌드되었습니다.3.2

오류 :

ActiveRecord::RecordNotUnique 
    SQLite3::ConstraintException: columns adventurer_id, item_id are not unique: 
    INSERT INTO "adventurers_items" ("adventurer_id", "item_id") VALUES (1, 68) 

에러 생성하는 코드 :

class AdventurersItems < ActiveRecord::Migration 
    def change 
    create_table :adventurers_items do |t| 
     t.integer :item_id, :null => false 
     t.integer :adventurer_id, :null => false 
    end 

add_index :adventurers_items, :item_id 
add_index :adventurers_items, :adventurer_id 
add_index :adventurers_items, [:adventurer_id, :item_id], :unique => true 
0 조인 테이블 adventurers_skills를 생성

class Adventurer < ActiveRecord::Base 

    after_create :set_starting_skills 
    after_create :set_starting_items 

    has_and_belongs_to_many :items 
    has_and_belongs_to_many :skills 

    # automatically add starting skills on creation 
    def set_starting_skills 
    self.skills = self.profession.starting_skills 
    end 

    # automatically add starting items on creation 
    def set_starting_items 
    self.items = self.profession.items 
    end 

마이그레이션

테이블이 있고 완전히 비어 있습니다. 고유성 제약으로 인해 애플리케이션에서이 레코드를 삽입하지 못하는 이유는 무엇입니까? 또한 동일한 테이블 "adventurers_skills"와 동일한 오류가 있습니다 - 제가 구조적으로 잘못된 것을하고 있습니까?

편집

시스템은 두 번 같은 아이템/스킬을 추가하려고합니다. 개인 메소드를 다음과 같이 변경하면 :

def set_starting_skills 
    skills = profession.starting_skills 
end 

조인 테이블에 아무 것도 만들지 않습니다.

1.9.3-p194 :022 > Profession.find(7).starting_skills.each {|x| puts x.id} 
54 

를 따라서 : 그러나 아래 self.skills하는 첫 번째 라인을 되 돌리는 것은이 아니라 하나 개의 기술이 profession.starting_skills에 대해 반환

(0.4ms) INSERT INTO "adventurers_skills" ("adventurer_id", "skill_id") VALUES (4, 54) 
(4.9ms) INSERT INTO "adventurers_skills" ("adventurer_id", "skill_id") VALUES (4, 54) 
SQLite3::ConstraintException: columns adventurer_id, skill_id are not unique: 
INSERT INTO "adventurers_skills" ("adventurer_id", "skill_id") VALUES (4, 54) 
(3.2ms) rollback transaction 

같은 기술을 생성 두번

def set_starting_skills 
    self.skills = profession.starting_skills 
end 

반환하려고 시도 진짜 질문은 : Rails가이 HABTM 레코드를 두 번 추가하려고하는 이유는 무엇입니까?

+1

오류를 나타내는 코드를 알려주십시오. 모델과 마이그레이션은 실제로 데이터를 삽입하지 않습니다. 그래도 뭔가가 있습니다. 그래서 우리에게 "다른 것"을 보여주세요. –

+0

음, 콜백 메소드를 어딘가에서 두 번 호출하는 버그가있어서 항목을 두 번 삽입하려고했습니다. – DrFunk

+0

그래서이 문제를 해결 했습니까? 왜냐하면 나는 똑같은 것을 얻고 있기 때문이다. – dukedave

답변