ActiveRecord和has_one&的使用有很多

时间:2011-09-01 00:07:08

标签: ruby activerecord has-many has-one

考虑这个简单模型,其中Project只有一个ProjectType,当然很多Projects都属于这种类型。

所以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

我的Project类看起来像这样(在本例中再次简化)

#!usr/bin/ruby
require 'active_record'

class Project < ActiveRecord::Base
  has_one :type, :class_name => 'ProjectType'
end

我的ProjectType看起来像

#!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_id表中有project_types字段,但如果ProjectType可以与许多Projects相关联则没有意义。我怀疑我的问题与我希望能够将ProjectType称为project.type而不是project.project_type有关,但我不确定我是如何解决这个问题的。< / p>

1 个答案:

答案 0 :(得分:1)

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

您还需要在项目表中添加project_type_id列。