ActiveRecord和has_one&has_many的使用
问题描述:
考虑这个简单的模型,其中Project
有一个ProjectType
,当然很多Projects
可以是这种类型。ActiveRecord和has_one&has_many的使用
所以一个Project
has_one :project_type
(称为type
)和ProjectType
has_many :projects
。
在我迁移我把(简化本示例)
create_table :projects do |t|
t.string :name, :null => false
t.integer :type
end
create_table :project_types do |t|
t.string :name, :null => false
end
我的项目类看起来像这样(再次简化了这个例子)
#!usr/bin/ruby
require 'active_record'
class Project < ActiveRecord::Base
has_one :type, :class_name => 'ProjectType'
end
我的项目类型看起来像
#!usr/bin/ruby
require 'active_record'
class ProjectType < ActiveRecord::Base
has_many :projects
end
我写了一个简单的单元测试来检查这个作品
#test creation of Projects and related objects.
def test_projects_and_etc
pt = ProjectType.create(:name => 'Test PT')
project = Project.create(:name => 'Test Project', :type => pt)
assert project.type.name == 'Test PT', "Wrong Project Type Name, expected 'Test PT' but got '#{project.type.name}'."
# clean up
project.destroy
pt.destroy
end
该测试抛出的断言错误,说
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: project_types.project_id: SELECT "project_types".* FROM "project_types" WHERE ("project_types".project_id = 1) LIMIT 1
的SQL似乎假设有在project_types
表project_id
场,但没有任何意义,如果ProjectType
可以关联与许多Projects
。我怀疑我的问题与我想要能够参考ProjectType
为project.type
而不是有关,但我不确定我会如何解决此问题。
答
您需要在项目模型上使用belongs_to而不是has_one。
您还需要在项目表上添加一个project_type_id列。
好吧,所以进一步阅读告诉我,has_one严格适用于1:1的关系,而不是我想要做的事情,所以如果有一点语言上的奇怪,现在一个'Project'属于一个ProjectType '。重新添加一个'project_type_id',如果我想将该字段称为'type'而不是'project_type',该怎么办?将't.integer type'改为't.integer type_id'足够了吗?如果是这样,我将添加到我的模型中?我试图做出这些变化,现在我的测试会抛出一个错误'NoMethodError:未定义的方法'名称'为nil:NilClass' –
我现在也试着改变迁移以读取't.integer project_type_id'的建议'工程'表,但我得到完全相同的错误。 –
您是否已经回滚并重新运行现在已经修改它的迁移?您是否还在项目模型中指定了: 'belongs_to:project_type' ? 至于叫它“类型”,这是一个保留字用于单表继承,所以不要这样做。 –