2009-12-11 12 views
19

私はRoRを初めて使い、まだ関連付けをしています。別のモデルの特定のモデルに2つの参照が必要です。スキャフォールドされたコードが機能せず、「初期化されていない定数」エラーが発生します。1つのテーブル内の同じテーブルの2つの外部キーのためのRails関連

世代コマンド:

script/generate scaffold BaseModel name:string 
script/generate scaffold NewModel name:string base1:references base2:references 
db:migrate 

生成されたモデル:

class NewModel < ActiveRecord::Base 
    belongs_to :base1 
    belongs_to :base2 
end 

class BaseModel < ActiveRecord::Base 
    has_many :new_models # I added this line 
end 

私は/new_models/newでnew_modelを作成しよう

は、私はIDと名前の両方を試してみましたBaseModelのそれは動作しません。私が手にエラーがある:

@new_model = NewModel.new(params[:new_model]) 
@base1 = BaseModel.find(1) # this exists 
@base2 = BaseModel.find(2) # this exists 
@new_model.base1 = @base1 # This throws the same error as above 

は私が欠けているものがありますか?A:

uninitialized constant NewModel::Base1 

私の方法を作るので、私は、それは名前をマップ推測、私は明示的にBaseModelインスタンスを設定しようとしましたか

答えて

31

ほとんどのRailsののマジックは、設定上の慣習から来ています。ガイドラインに従って名前を付けることによって、Railsはほとんどの設定オプションで推測できます。 ActiveRecord :: Associationは例外ではありません。

ActiveRecord Associationの最初の引数は、モデル内で使用される名前です。これは通常、別のモデルの名前です。これが規約です。デフォルトでは、クラス名はcamelcaseのアソシエーション名の単数形です。アソシエーション内のデフォルトの外部キーは、「_id」を後に付けたアソシエーション名です。アソシエーション名がこれらのパターンでクラス名または外部キーと一致しない場合は、それらをオプションとして指定する必要があります。

これは、あなたがやりたいことになります。

class NewModel 
    belongs_to :base1, :class_name => "BaseModel" 
    belongs_to :base2, :class_name => "BaseModel" 
end 

は個人的に私は組合にそのBASE1及びBASE2より説明的な名前を与えるだろう。このような何か:

評価表:ID、rater_id、rated_id、評価

class Rating 
    belongs_to :rater, :class_name => "User" 
    belongs_to :rated_user, :class_name => "User", :foreign_key => "rated_id" 
end 

異なる例が使用されたかもしれませんが、これは、外部キーオプションが必要な場合に強調するために選ばれました。

0

belongs_toメソッドに渡されるシンボルは、他のモデルの特異な名前である必要があります。だからあなた例えば、それは次のようになります。

class NewModel < ActiveRecord::Base 
    belongs_to :base_model 
end