1

我的应用程序中有 3 个控制器(与此问题相关):

  • 员工
  • 测验
  • 分数

当员工参加测验时,我需要能够记录他们的分数,以便将QuizEmployee参加的、参加测验的人以及Score他们取得的成绩联系起来。目前这是我设置模型的方式:

score_assignment.rb

class ScoreAssignment < ActiveRecord::Base
    belongs_to :score
    belongs_to :employee
    belongs_to :quiz
end

员工.rb

class Employee < ActiveRecord::Base
  has_many :score_assignments
  has_many :quizzes, :through => :score_assignments
  has_many :scores,  :through => :score_assignments
end

测验.rb

class Quiz < ActiveRecord::Base
    has_many :score_assignments
    has_many :scores, :through => :score_assignments
    has_many :employees, :through => :score_assignments
end

分数.rb

class Score < ActiveRecord::Base
    has_many :score_assignments
    has_many :quizzes,   :through => :score_assignments
    has_many :employees, :through => :score_assignments
end

我对此的第一个疑虑(除了不确定如何实际将分数同时添加到所有模型 - 我将在下一节中介绍)是分数不应该有很多员工、测验或员工。虽然员工将参加多个测验并为他参加的每个测验累积分数,但分数只会分配给一个测验和一个员工。但是,当我离开其他模型时,我无法让该has_one属性与 score 一起使用。has_many

第一个问题:

这个设置正确吗?(或者有更好的方法来做到这一点)

第二个问题:

如果设置正确,我如何一次在所有 3 个模型中添加分数?以下是我在控制台中尝试过的一些我认为不起作用的事情:

s = Score.new(percentile: 99)
q = Quiz.first
e = Employee.first    
q.scores << s
e.scores << s

额外信息 - 数据库迁移,以防它们有帮助:

class CreateQuizzes < ActiveRecord::Migration
  def change
    create_table :quizzes do |t|
      t.string :name
      t.text :text

      t.timestamps
    end
  end
end


class CreateEmployees < ActiveRecord::Migration
  def change
    create_table :employees do |t|
      t.string :name
      t.string :code
      t.string :password_digest

      t.timestamps
    end
  end
end


class CreateScores < ActiveRecord::Migration
  def change
    create_table :scores do |t|
      t.integer :percentile

      t.timestamps
    end
  end
end


class CreateScoreAssignments < ActiveRecord::Migration
  def up
    create_table :score_assignments do |t|
      t.integer :quiz_id
      t.integer :employee_id
      t.integer :score_id

      t.timestamps
    end

    add_index :score_assignments, :quiz_id
    add_index :score_assignments, :employee_id
    add_index :score_assignments, :score_id
  end

  def down
    drop_table :score_assignments
  end
end
4

1 回答 1

1

将分数存在于他们自己的表格中似乎很疯狂,尤其是考虑到它们只是一个百分比。为什么不使用一个表格将测验、员工联系在一起,并为百分比增加一列?

create_table :scores do |t|
  t.integer :quiz_id
  t.integer :customer_id
  t.integer :percentile
end

然后你会这样关联:

class Score < ActiveRecord::Base
  belongs_to :quiz
  belongs_to :employee
end

class Employee < ActiveRecord::Base
  has_many :scores
  has_many :quizzes, :through => :scores
end

class Quiz < ActiveRecord::Base
  has_many :scores
  has_many :employees, :through => :scores
end

要获得员工测验的分数:

quiz.scores.where(:employee_id => employee.id).first.percentile

要创建新乐谱:

quiz.scores.create(:employee_id => employee.id, :percentile => 99)
于 2013-09-02T22:57:45.000 回答