两个模型类在Rails / ActiveRecord中彼此相互拥有

时间:2012-09-15 18:17:14

标签: ruby-on-rails ruby-on-rails-3 activerecord orm ruby-on-rails-3.2

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

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

LessonLessonVersion之间存在1-many关系。我通过在belongs_to :lesson课程中设置LessonVersion来建模。目前,我不会处理该关系的Lesson类部分中的has_many :lesson_versions

其次,我还需要知道每节课的最新版本才能立即启动。因此,在Lesson模型中,我需要引用LessonVersion。我想这是一种1-1型关系。

以这种方式建模是否有意义?每个班级彼此belongs_to会遇到麻烦吗?

2 个答案:

答案 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"进行排序,当您想恢复到旧版本时,请复制它并使其成为最新版本。然后你有所有编辑的历史记录,不需要

对于查询中的顺序,如果在数据库中的versionlesson_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