使用提供的类名和belongs_to编写HABTM关系的迁移

时间:2013-07-20 22:57:54

标签: ruby-on-rails ruby-on-rails-4

我在用户和课程之间有一个关系模型(“课程”,如“我正在学习统计学课程”)。一个班级有一名教师(一名用户)和许多学生(也是用户);用户可以教授很多课程,但也可以参加很多课程。

我相信在我的模型中建立这种关系的正确方法是:

class User < ActiveRecord::Base
  has_many :taught_courses, class_name: "Course"
  has_and_belongs_to_many :enrolled_courses, class_name: "Course"
end

class Course < ActiveRecord::Base
  belongs_to :teacher, class_name: "User"
  has_and_belongs_to_many :students, class_name: "User"
end

但我不知道如何在我的数据库中设置它(我是新手)。

编辑:

我的迁移相当于:

def change
  create_table :courses_users do |t|
    t.belongs_to :course
    t.belongs_to :user
  end

  create_table :courses do |t|
    t.string :name
    t.integer :teacher_id

    t.timestamps
  end
end

但是当我尝试在控制台中创建一个新用户时,我收到有关user_id的错误:

irb(main):007:0> u.taught_courses.create(name: "Foo bar")
   (0.0ms)  SAVEPOINT active_record_1
   (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
ActiveRecord::UnknownAttributeError: unknown attribute: user_id

user_id应该在哪里?或者我应该更具体地说明我的外键?

编辑2

事实证明,我还必须在用户和课程之间的foreign_key: "teacher_id"关系上指定has_many才能使其发挥作用。

对这个误导性问题感到抱歉。

1 个答案:

答案 0 :(得分:1)

关系模型对我来说似乎是合理的。数据库设置在http://guides.rubyonrails.org/association_basics.html#updating-the-schema的3.3.2中讨论。如果您发现该部分的某个特定部分令人困惑,那么这会帮助您提出更狭隘的问题。

例如,上面的部分包括以下示例迁移。您可以解释这个示例似乎不适用于您的情况。

class CreateAssembliesPartsJoinTable < ActiveRecord::Migration
  def change
    create_table :assemblies_parts, id: false do |t|
      t.integer :assembly_id
      t.integer :part_id
    end
  end
end

id: false条款的重要性在前面部分的最后一段解释如下:

  

我们将id: false传递给create_table,因为该表没有   代表一个模型。这是协会工作所必需的   正常。如果你观察到任何奇怪的行为   has_and_belongs_to_many association类似于错误的模型ID,或者   关于ID冲突的例外,你有可能忘记这一点。