2009-12-11 54 views
19

我是RoR的新手,仍在玩关联。我需要在另一个模型中有两个对特定模型的引用。脚手架的代码不起作用,我得到一个“未初始化的常量”错误。在一张表中为同一张表的两个外键的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,但它不起作用。我得到的错误是:

uninitialized constant NewModel::Base1 

我猜它映射的名字,所以在我创建的方法,我想明确地设置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 

有什么我失踪?

回答

31

大部分Rails的魔术来自约定而非配置。通过根据准则命名事物Rails可以猜到大部分配置选项。 ActiveRecord ::关联也不例外。

任何ActiveRecord关联的第一个参数是将在模型中使用的名称。这通常是另一个模型的名称,这是惯例。默认的类名是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 
相关问题