2011-09-01 94 views
3

考慮這個簡單的模型,其中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而不是​​有關,但我不確定我會如何解決此問題。

回答

1

您需要在項目模型上使用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' ? 至於叫它「類型」,這是一個保留字用於單表繼承,所以不要這樣做。 –