Roh*_*hit 19 ruby-on-rails associations
我是RoR的新手,还在玩协会.我需要在另一个模型中有两个对特定模型的引用.脚手架代码不起作用,我得到一个"未初始化的常量"错误.
生成命令:
script/generate scaffold BaseModel name:string
script/generate scaffold NewModel name:string base1:references base2:references
db:migrate
Run Code Online (Sandbox Code Playgroud)
生成的模型:
class NewModel < ActiveRecord::Base
belongs_to :base1
belongs_to :base2
end
Run Code Online (Sandbox Code Playgroud)
和
class BaseModel < ActiveRecord::Base
has_many :new_models # I added this line
end
Run Code Online (Sandbox Code Playgroud)
当我尝试创建一个new_model时/new_models/new,我尝试了ID和BaseModel的名称,但它不起作用.我得到的错误是:
uninitialized constant NewModel::Base1
Run Code Online (Sandbox Code Playgroud)
我猜它映射了名称,所以在我的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
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?
Mat*_*ght 31
大多数Rails的魔力来自于约定优于配置.通过根据指南命名,Rails可以猜测大多数配置选项.ActiveRecord :: Associations也不例外.
任何ActiveRecord关联的第一个参数是将在模型中使用的名称.这通常是另一个模型的名称,这是惯例.默认情况下,类名是camelcase中关联名称的唯一名称.关联中的默认外键是后缀为"_id"的关联名称.如果您的关联名称与这些模式的类名或外键不匹配,则需要将它们作为选项提供.
这将做你想要的:
class NewModel
belongs_to :base1, :class_name => "BaseModel"
belongs_to :base2, :class_name => "BaseModel"
end
Run Code Online (Sandbox Code Playgroud)
我个人会给协会更多的描述性名称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
Run Code Online (Sandbox Code Playgroud)
可以使用另一个示例,但选择此选项以突出显示何时需要外键选项.
| 归档时间: |
|
| 查看次数: |
12262 次 |
| 最近记录: |