在一个表中为同一张表的两个外键建立Rails关联

19

我是RoR的新手,还在学习关联技术。我需要在另一个模型中引用特定模型的两个参考。生成代码不起作用,我遇到了“未初始化常量”错误。

生成命令:

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创建一个新模型时,我已经尝试了BaseModel的ID和名称,但不起作用。我得到的错误是:
uninitialized constant NewModel::Base1

我猜它是映射名称,因此在我的create方法中,我尝试显式设置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

我有什么遗漏的吗?

2个回答

31

在Rails中,大部分的魔法都来自约定优于配置。通过按照指南命名事物,Rails可以猜测大部分配置选项。ActiveRecord::Associations也不例外。

任何ActiveRecord Association的第一个参数是将在模型内使用的名称。通常这是另一个模型的名称,这是约定。默认情况下,类名是驼峰式写法的关联名称的单数形式。关联中的默认外键是关联名称后缀加上“_id”。如果您的关联名称不符合这些模式的类名或外键,则需要将它们作为选项提供。

这将实现你想要的效果:

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

个人建议将关联命名为更有描述性的名称,而不是base1和base2。类似这样:

评分表:id、评分者id、被评分者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 

请查看Active Record关联Rails指南以获取更多详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接