1

我创建了一个简单的示例作为健全性检查,但似乎仍然无法破坏 rails 中 has_and_belongs_to_many 关系两侧的项目。

每当我尝试从任一表中删除对象时,都会收到可怕的 NameError /“未初始化常量”错误消息。

为了演示,我创建了一个带有 Boy 类和 Dog 类的示例 rails 应用程序。我为每一个都使用了基本的脚手架,并创建了一个名为boys_dogs 的链接表。然后,我添加了一个简单的 before_save 例程,以在任何时候创建一个男孩并建立关系时创建一个新的“狗”,以便轻松设置。

狗.rb

class Dog < ActiveRecord::Base  
  has_and_belongs_to_many :Boys  
end  

男孩.rb

class Boy < ActiveRecord::Base  
  has_and_belongs_to_many :Dogs  

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

end  

架构.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#destroy
未初始化常量 Boy::Dogs 中的 NameError

跟踪看起来像:

/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:105:in destroy_without_callbacks' /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record /callbacks.rb:337:in发送' ...const_missing'
(eval):3:in

destroy_without_transactions'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:229:in

谢谢。

4

2 回答 2

3

我没有看到您的销毁回调,但我确实看到了一些问题。首先,您的关联必须是小写的。所以 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上面的,因为 build 实际上不会保存新的 dog 对象。

于 2010-01-18T07:35:01.057 回答
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 文档中未提及此选项。

于 2010-04-30T05:42:25.793 回答