3
考慮這個簡單的模型,其中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
而不是有關,但我不確定我會如何解決此問題。
好吧,所以進一步閱讀告訴我,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' ? 至於叫它「類型」,這是一個保留字用於單表繼承,所以不要這樣做。 –