我有一个课程模型的版本控制机制:
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
之间存在1-many关系。我通过在belongs_to :lesson
课程中设置LessonVersion
来建模。目前,我不会处理该关系的Lesson类部分中的has_many :lesson_versions
。
其次,我还需要知道每节课的最新版本才能立即启动。因此,在Lesson
模型中,我需要引用LessonVersion
。我想这是一种1-1型关系。
以这种方式建模是否有意义?每个班级彼此belongs_to
会遇到麻烦吗?
答案 0 :(得分:0)
我认为你所寻找的是has_and_belongs_to_many,它与另一个班级建立了多对多的关系。
http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many
答案 1 :(得分: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"
排序。
编辑:阅读完评论后,我有两点建议。
建议1
使用上面的解决方案,但使用"version DESC"
进行排序,当您想恢复到旧版本时,请复制它并使其成为最新版本。然后你有所有编辑的历史记录,不需要
对于查询中的顺序,如果在数据库中的version
和lesson_id
上添加复合索引,这将是一个简单的操作。此外,在作用域上调用#first
是有效的,它将使用LIMIT 1
进行查询,并仅实例化您关注的记录。如果您需要在同一请求中多次使用此方法,则会自动缓存查询结果。
建议2
在Lesson上设置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