2

我的应用程序中有一个学生和教师模型。我希望老师能够创建学生可以多次完成的任务,但我也希望学生能够创建他/她自己的任务。这是我当前的模型结构:

class Task < ActiveRecord::Base
 belongs_to :teacher
 belongs_to :student
 has_many :completed_tasks

class Student < ActiveRecord::Base
 belongs_to :teacher
 has_many :tasks
 has_many :completed_tasks

class Teacher < ActiveRecord::Base
 has_many :students
 has_many :tasks

class CompletedTask < ActiveRecord::Base
 belongs_to :student
 belongs_to :task

在我看来,我希望老师能够为他/她的学生添加任务。当学生查看他们的任务时,他们会看到教师的可用任务并且可以添加自己的任务。然后学生在单独的视图中将任务标记为已完成。我应该考虑为此使用多态关联吗?我的情况似乎与Ryan Bates 的 Railscast #154中使用的情况有点不同,因为教师和学生与任务的交互方式略有不同。

4

1 回答 1

5

我会使用多态关联Task来表示任务的创建者。Teacher和之间的关联Task可能是不必要的,除非教师可以拥有并非由他们创建的可用任务。如果是这种情况,请将当前关联保留给教师,但如果不是,则只需要创建者的关联。

代替CompletedTask,我会使用一个名为 的类Assignment,它既属于任务又属于学生,并且还有一个completed默认为 false 的标志。这允许跟踪哪些学生被分配了哪些任务,这些任务是正在进行还是已完成。

class Task < ActiveRecord::Base
  belongs_to :creator, :polymorphic => true

  has_many :assignments
  has_many :assigned_students, :through => :assignments, :source => :student
end

class Student < ActiveRecord::Base
  belongs_to :teacher
  has_many :created_tasks, :as => :creator, :class_name => 'Task'

  has_many :assignments
  has_many :assigned_tasks, :through => :assignments, :source => :task
end

class Teacher < ActiveRecord::Base
  has_many :students
  has_many :created_tasks, :as => :creator, :class_name => 'Task'
end

class Assignment < ActiveRecord::Base
  belongs_to :student
  belongs_to :task

  scope :complete, where(:completed => true)
  scope :incomplete, where(:completed => false)
end
于 2012-06-23T22:25:18.713 回答