更新Rails关联表

时间:2013-12-28 21:00:31

标签: mysql ruby-on-rails ruby database-design

我正在使用Rails中的测验应用程序来跟踪一些事实

应用程序/模型/ fact.rb

class Fact < ActiveRecord::Base
    validates(:question, presence: true, uniqueness: { case_sensitive: false })
    validates(:answer, presence: true)
end

每次用户参加新测验时,他们都会生成考试

应用程序/模型/ exam.rb

class Exam < ActiveRecord::Base
    after_create :assign_facts
    belongs_to :user
    default_scope -> { order('created_at DESC') }
    validates :user_id, presence: true
    has_many :problems
    has_many :facts, through: :problems

    def assigned?(fact)
        problems.find_by(fact_id: fact.id)
    end

    def assign!(fact)
        problems.create!(fact_id: fact.id)
    end

    private

        def assign_facts
            facts = Fact.all.sample(10)
            facts.each do |fact|
                self.assign!(fact)
            end
        end

end

由于许多考试都使用相同的事实,因此每次考试has_many事实though 问题

的关联表

应用程序/模型/ problem.rb:

class Problem < ActiveRecord::Base
    belongs_to :exam
    belongs_to :fact
    validates :exam_id, presence: true
    validates :fact_id, presence: true
end

摘自db / scheme.rb:

  create_table "problems", force: true do |t|
    t.integer  "exam_id"
    t.integer  "fact_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "correct",    default: false
  end

我的问题是我正在试图找出如何存储每个用户考试的结果(他们是否正确或错误地回答了特定问题)。每当用户回答问题并将结果存储在t.boolean "correct"列中时,我就计划更新关联表。这在PHP / MySQL(UPDATE problems SET correct = 1 WHERE exam = 'id' AND fact = 'id')中是一个相当简单的问题,但我很难弄清楚如何以Rails的方式来实现它。

有没有什么方法可以简单地使用Rails轻松更新我的关联表(问题)? OR 我应该创建第四个表(可能是“结果”或其他内容)来跟踪用户的正确/错误答案吗? - 我知道我这里没有任何控制器代码,我只是在考虑广泛的笔触,我想保持简单。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你几乎就在那里......你已经在correct模型的模式中添加了一个名为problem的布尔列,所以现在你只需要在更新{{{}}时将其作为属性进行访问{1}}。在控制器代码中的某处,你会说:

Exam

如果您使用的是Rails3,则必须在模型中将ps=@exam_taken.problems ps.each do |p| if answered_correctly(p) p.correct=true p.save end end # This assumes you have a method that checks correctness inside the binding where the # above code is written @exam_taken.save 属性声明为correct

这是一个免费的专业提示:Default scope is evil:)