2010-01-18 9 views
0

나는 온전한 체크로서 간단한 예제를 만들었고 레일에서 has_and_belongs_to_many 관계의 어느 한 쪽에서 아이템을 파괴하는 것처럼 보이지는 않는다.오류없이 삭제/삭제하는 레일 habtm을 만드는 방법은 무엇입니까?

어느 테이블에서든지 개체를 삭제하려고 할 때마다 두려운 NameError/"초기화되지 않은 상수"오류 메시지가 나타납니다.

설명하기 위해 Boy 클래스와 Dog 클래스가있는 샘플 레일즈 앱을 만들었습니다. 나는 각각을 위해 기본적인 비계를 사용하고 boys_dogs라고 불리는 연결 테이블을 만들었다. 그런 다음 간단한 before_save 루틴을 추가하여 소년이 생성되고 관계를 수립 할 때마다 새로운 '개'를 만들어 루비를 쉽게 설정했습니다.

dog.rb

class Dog < ActiveRecord::Base 
    has_and_belongs_to_many :Boys 
end 

boy.rb

class Boy < ActiveRecord::Base 
    has_and_belongs_to_many :Dogs 

    def before_save 
    self.Dogs.build(:name => "Rover") 
    end 

end 

schema.rb는

ActiveRecord::Schema.define(:version => 20100118034401) do 

    create_table "boys", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "boys_dogs", :id => false, :force => true do |t| 
    t.integer "boy_id" 
    t.integer "dog_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "dogs", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

end 

여기와 다른 곳에서 유사한 문제에 대한 글을 많이 볼 수 있지만, 한 솔루션은 보통 belongs_to와 복수/단일 클래스 이름을 혼동하여 사용합니다. 나는 그것이 여기에 해당한다고 생각하지 않지만 habtm 문을 단수 이름을 사용하여 전환하는 것이 도움이되는지보기 위해 노력했다. 나는 여기서 간단한 것을 놓치고있는 것 같다.

실제 오류 메시지는 다음과 같습니다 BoysController 번호에

나가서 설명하자면 NameError가 추적 보이는
초기화되지 않은 상수 보이 :: 개

을 파괴 같은 :

/라이브러리/루비 /Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:105:in const_missing'
(eval):3:in
destroy_without_callbacks '
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/callbacks.rb:337:in destroy_without_transactions'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:229:in
보내기 '
...

감사합니다.

답변

2

파괴 콜백이 보이지 않지만 몇 가지 문제점이 있습니다. 첫째, 귀하의 협회는 소문자 여야합니다.

class Dog < ActiveRecord::Base 
    has_and_belongs_to_many :boys 
end 

및 boy.rb가 있어야한다 : 그래서 dog.rb이어야

class Boy < ActiveRecord::Base 
    has_and_belongs_to_many :dogs 

    def before_save 
    self.dogs.build(:name => "Rover") 
    end 
end 

둘째, 나는 빌드가 실제로 저장되지 않기 때문에, 대신 위의 self.dogs.buildself.dogs.create을 사용하려는 생각 새로운 개 개체.

+0

굉장합니다. 감사. 소문자로 변경하는 것이 트릭을 만들었습니다. 참고 : 소년 개체가 이미 저장되어 있지 않으면 self.dogs.create를 사용할 수 없습니다. 하지만 아마 그걸 after_save로 옮길 수있을거야. self.dogs.build 명령은있는 그대로 작동하는 것 같습니다. 다시 한번 감사드립니다. – Bradley

+0

안녕 Bradley- 도움이 되서 기쁩니다. 그리고 모델 저장은 실제로 모든 빌드 된 연관을 저장하는 것입니다. 이것은 이전에 모르는 것입니다. 본 사이트를 처음 보신 분이 있습니다. 그것은 당신이 나의 대답을 받아들이면 당신의 문제를 해결 한 것이기 때문에 저를 도와줍니다. 그렇게하면, 나는 그것을 얻는다. 감사합니다. 자이 메 –

0

여기서 허용되는 대답은 내 문제를 해결하고 다른 문제를 해결하기위한 것입니다.선택 쿼리를 만들 때

class Complex < ActiveRecord::Base 
    set_table_name "Complexes" 
    set_primary_key "ComplexID" 
    has_and_belongs_to_many :amenities 
end 

class Amenity < ActiveRecord::Base 
    set_table_name "Amenities" 
    set_primary_key "AmenityID" 
end 

레일 테이블 이름으로 협회의 이름을 사용합니다 : 여기

내 모델 개체입니다. 내 응용 프로그램은 유닉스에서 레거시 MySQL 데이터베이스와 비교하여 실행되며 테이블 이름은 대소 문자를 구분하며 레일 규칙을 따르지 않습니다.

SELECT * FROM `amenities` 
INNER JOIN `ComplexAmenities` ON `amenities`.AmenityID = `ComplexAmenities`.AmenityID 
WHERE (`ComplexAmenities`.ComplexID = 147) 

내가 검색 및 검색과의 올바른 케이스를 사용하여 레일을 말할 수있는 방법을 찾을 수 없습니다 : 내 응용 프로그램이 실제로 연결을로드하려고 할 때마다, 나는 MySQL이 테이블 amenities을 찾을 수 없다는 예외를 얻을 것 테이블 이름. 필사적으로 나는 :table_name 옵션을 habtm에 전달하려고 시도했지만 효과가 있었다. 새로운 복합 모델은 다음과 같습니다.

class Complex < ActiveRecord::Base 
    set_table_name "Complexes" 
    set_primary_key "ComplexID" 
    has_and_belongs_to_many :amenities, :table_name => 'Amenities' 
end 

이 기능은 Rails 2.3.5에서 작동합니다.

이 옵션은 Ruby on Rails 문서에 언급 된 이 아니며입니다.