我的应用程序中有3个控制器(与此问题相关):
当员工参加测验时,我需要能够记录他们的分数,以便将Quiz
拍摄的Employee
与参加测验的Score
以及class ScoreAssignment < ActiveRecord::Base
belongs_to :score
belongs_to :employee
belongs_to :quiz
end
相关联他们实现了。目前,这就是我的模型设置:
score_assignment.rb
class Employee < ActiveRecord::Base
has_many :score_assignments
has_many :quizzes, :through => :score_assignments
has_many :scores, :through => :score_assignments
end
employee.rb
class Quiz < ActiveRecord::Base
has_many :score_assignments
has_many :scores, :through => :score_assignments
has_many :employees, :through => :score_assignments
end
quiz.rb
class Score < ActiveRecord::Base
has_many :score_assignments
has_many :quizzes, :through => :score_assignments
has_many :employees, :through => :score_assignments
end
score.rb
has_one
我对此的第一个疑问(除了不确定如何将评分同时添加到所有模型中 - 我将在下一节中介绍)是评分不应该有很多员工,测验或员工。虽然员工将参加几个测验并为每个测验积累一个分数,但只会将分数分配给一个测验和一个员工。但是,当has_many
留在其他模型上时,我无法让s = Score.new(percentile: 99)
q = Quiz.first
e = Employee.first
q.scores << s
e.scores << s
属性与分数一起使用。
第一个问题:
这个设置是否正确? (或者有更好的方法来做到这一点)
第二个问题:
如果设置正确,我该如何在所有3个模型中同时添加分数?以下是我在控制台中尝试过的一些我认为不起作用的事情:
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
额外信息 - 数据库迁移,以防他们提供帮助:
{{1}}
答案 0 :(得分: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)