1

サニティチェックとして簡単な例を作成しましたが、レールの has_and_belongs_to_many 関係のどちらの側でもアイテムを破棄できないようです。

いずれかのテーブルからオブジェクトを削除しようとするたびに、恐ろしい NameError / "uninitialized constant" エラー メッセージが表示されます。

実例を示すために、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  

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

ここや他の場所で同様の問題について多くの投稿を見てきましたが、解決策は通常、属しているクラス名を使用しており、複数形/単数形のクラス名が混乱しています。ここではそうではないと思いますが、habtm ステートメントを切り替えて単数形の名前を使用して、それが役立つかどうかを確認してみました (うまくいきませんでした)。ここで単純なものが欠けているようです。

実際のエラー メッセージは次のとおりです。

BoysController の NameError#destroy
未初期化定数 Boy::Dogs

トレースは次のようになります。

/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 send' ...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

次に、 buildは実際には新しい犬のオブジェクトを保存しないため、上記のself.dogs.create代わりに使用することをお勧めします。self.dogs.build

于 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 は、select クエリを作成するときに、関連付けの名前をテーブル名として使用します。私のアプリケーションはレガシー MySQL データベースに対して Unix で実行され、私のテーブル名は大文字と小文字が区別され、Rails 規則に準拠していません。私のアプリが実際に関連付けを読み込もうとすると、MySQL could not find table という例外が発生します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 に答える