1

我有一个课程模型的版本控制机制:

class Lesson < ActiveRecord::Base
  attr_accessible :lesson_version_id, :number
  belongs_to :lesson_version
end

class LessonVersion < ActiveRecord::Base
  attr_accessible :lesson_id, :version
  belongs_to :lesson
end

Lesson和之间存在一对多的关系LessonVersion。我belongs_to :lessonLessonVersion课堂上对此进行了建模。现在,我不会处理has_many :lesson_versions这种关系的“课程”部分。

其次,我还需要知道每节课的最新版本,以便能够立即上手。所以在Lesson模型中我需要引用一个LessonVersion. 我想这是一种1-1类型的关系。

以这种方式建模有意义吗?我会belongs_to在每节课上遇到麻烦吗?

4

2 回答 2

0

我认为您正在寻找的是 has_and_belongs_to_many,它指定了与另一个类的多对多关系。

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

于 2012-09-15T18:54:51.440 回答
0

我不会创建另一个关系,而是使用LessonVersion.

class Lesson < ActiveRecord::Base
  attr_accessible :number
  has_many :lesson_versions

  def most_recent_version
    lesson_versions.most_recent.first
  end
end

class LessonVersion < ActiveRecord::Base
  attr_accessible :lesson_id, :version
  belongs_to :lesson
  scope :recent, order("created_at DESC")
end

"version DESC"此外,如果版本是随每个新版本增加的整数,您可能更喜欢排序。

编辑:阅读您的评论后,我有两个建议。

建议一

使用我上面的解决方案,但使用"version DESC"排序,当您想恢复到旧版本时,请复制它并使其成为最新版本。然后你有所有编辑的历史并且不需要

至于查询中的顺序,如果您在数据库上versionlesson_id数据库中添加复合索引,这将是一个微不足道的操作。此外,调用#first范围很有效,它将查询LIMIT 1并仅实例化您关心的记录。如果您需要在同一个请求中多次使用此方法,查询的结果会自动缓存。

建议二

在课程上设置一个belongs_to,但将其命名为:current_version,以防止混淆。

class Lesson < ActiveRecord::Base
  attr_accessible :number, :current_version_id
  has_many :lesson_versions
  belongs_to :current_version, :class_name => "LessonVersion"
end

class LessonVersion < ActiveRecord::Base
  attr_accessible :lesson_id, :version
  belongs_to :lesson
  scope :recent, order("created_at DESC")
end
于 2012-09-15T19:00:34.550 回答