3

この単純なモデルを考えてみましょう。a にProjectは 1 つが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

私のプロジェクトクラスは次のようになります (この例では再び簡略化されています)

#!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フィールドがあると想定しているようですが、 aを many に関連付けることができる場合、それは意味がありません。私の問題は、as notを参照できるようにしたいということと関係があると思いますが、これをどのように修正するかわかりません。project_typesProjectTypeProjectsProjectTypeproject.typeproject.project_type

4

1 に答える 1

1

プロジェクト モデルでは、has_one の代わりに belongs_to を使用する必要があります。

また、project_type_id 列を projects テーブルに追加する必要があります。

于 2011-09-01T00:17:58.603 に答える