Рассмотрим эту простую модель, где 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
Этот тест выдает ошибку приassert, говоря
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
, а не project.project_type
, но я не уверен, как бы это исправить.