在Rails中关联3个对象的正确方法

时间:2013-09-02 22:43:58

标签: ruby-on-rails

我的应用程序中有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}}

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)