以后可以扩展ActiveRecord关联定义吗?

时间:2013-05-07 23:20:03

标签: ruby-on-rails activerecord associations

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

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

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关联。有可能吗?

1 个答案:

答案 0 :(得分: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