-1

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

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

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关系才能使其工作。

对不起,误导性的问题。

4

1 回答 1

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 的异常,那么您很可能忘记了这一点。

于 2013-07-21T00:00:29.557 回答