0

我有一个Quiz,其中有很多Questions。我希望能够在测验中更改这些问题的顺序。但我不想使用诸如 之类的宝石acts_as_list,因为那样我就必须将位置列存储在Question类中。在我看来,它不属于那里;只有Quiz应该知道其问题的顺序。所以,我想在 中有一questions_orderQuiz,其中包含该信息。

因为我需要在另一个地方使用这种模式,所以我想将该功能提取到一个扩展中。因此,该扩展名看起来像这样:

class Quiz < ActiveRecord::Base
  has_many :questions, dependent: :destroy

  orders :questions
end

这将扩展为这样的:

class Quiz < ActiveRecord::Base
  has_many :questions, dependent: :destroy,
    after_add: :add_question_order,
    after_remove: :remove_question_order do
      def ordered
        # query for ordering questions
      end
    end
end

但是,这意味着该orders方法需要扩展已经定义的has_many :questions关联。有可能这样做吗?

4

1 回答 1

0

你可以尝试这样的事情:

class Quiz < ActiveRecord::Base
  has_many :questions, dependent: :destroy,
  after_add: :add_question_order,
  after_remove: :remove_question_order

  serialize :questions_order, Array

  def add_question_order(question)
    update_attribute(:questions_order, questions_order << question.id)
  end

  def remove_question_order(question)
    update_attribute(:questions_order, questions_order.delete(question.id))
  end
end
于 2013-05-07T23:44:53.003 回答