ActiveRecord и использование has_one & has_many - PullRequest
3 голосов
/ 01 сентября 2011

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

1 Ответ

1 голос
/ 01 сентября 2011

В модели проекта необходимо использовать принадлежать_ вместо хэссона для одного.

Вам также необходимо добавить столбец project_type_id в таблицу проектов.

...