我的应用程序中有 3 个控制器(与此问题相关):
- 员工
- 测验
- 分数
当员工参加测验时,我需要能够记录他们的分数,以便将Quiz
所Employee
参加的、参加测验的人以及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