2010-01-18 41 views
0

我創建了一個簡單的例子作爲完整性檢查,並且仍然無法破壞rails中has_and_belongs_to_many關係兩側的項目。如何創建一個刪除/銷燬沒有錯誤的rails habtm?

無論何時我嘗試從任一表中刪除一個對象,我都會遇到可怕的NameError /「uninitialized constant」錯誤消息。

爲了演示,我創建了一個帶有Boy類和Dog類的示例rails應用程序。我爲每個腳本使用了基本腳手架,並創建了一個名爲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

我沒有看到你的銷燬回調,但我確實看到了一些問題。首先,你的關聯需要小寫。所以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 

第二,我相信你想使用self.dogs.create代替上述self.dogs.build,因爲構建實際上不會保存新的狗對象。

+0

太棒了。謝謝。更改爲小寫做了訣竅。注意:除非男孩對象已經保存,否則使用self.dogs.create將不起作用。但我可以將其移至after_save。 self.dogs.build命令似乎按原樣工作。再次感謝。 – Bradley 2010-01-18 18:49:00

+0

嗨布拉德利 - 很高興幫助。我敢打賭,模型保存實際上是保存了所有建立的關聯,這是我以前不知道的。 我注意到你是新來的網站。如果你接受我的回答,它會幫助我,因爲它是解決你問題的方法。那樣,我得到它的信任。 謝謝, Jaime – 2010-01-18 23:46:45

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 

Rails的創建選擇查詢時使用的關聯表名的名稱。我的應用程序在Unix上針對傳統MySQL數據庫運行,我的表名稱區分大小寫,並且不符合Rails約定。每當我的應用程序實際上是試圖加載的關聯,我會得到一個例外是,MySQL找不到表amenities

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

我找啊找,無法找到一個方法來告訴Rails使用正確的情況下,表名。出於絕望,我試圖通過: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文檔中提到。