ActiveRecord和has_one&has_many的使用

问题描述:

考虑这个简单的模型,其中Project有一个ProjectType,当然很多Projects可以是这种类型。ActiveRecord和has_one&has_many的使用

所以一个Projecthas_one :project_type(称为type)和ProjectTypehas_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_typesproject_id场,但没有任何意义,如果ProjectType可以关联与许多Projects。我怀疑我的问题与我想要能够参考ProjectTypeproject.type而不是​​有关,但我不确定我会如何解决此问题。

您需要在项目模型上使用belongs_to而不是has_one。

您还需要在项目表上添加一个project_type_id列。

+0

好吧,所以进一步阅读告诉我,has_one严格适用于1:1的关系,而不是我想要做的事情,所以如果有一点语言上的奇怪,现在一个'Project'属于一个ProjectType '。重新添加一个'project_type_id',如果我想将该字段称为'type'而不是'project_type',该怎么办?将't.integer type'改为't.integer type_id'足够了吗?如果是这样,我将添加到我的模型中?我试图做出这些变化,现在我的测试会抛出一个错误'NoMethodError:未定义的方法'名称'为nil:NilClass' –

+0

我现在也试着改变迁移以读取't.integer project_type_id'的建议'工程'表,但我得到完全相同的错误。 –

+0

您是否已经回滚并重新运行现在已经修改它的迁移?您是否还在项目模型中指定了: 'belongs_to:project_type' ? 至于叫它“类型”,这是一个保留字用于单表继承,所以不要这样做。 –