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

と の間には 1 対多の関係が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

別の関係を作成する代わりに、スコープ on を使用します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"また、バージョンが新しいバージョンごとに増加する整数である場合は、順序付けを好むかもしれません。

編集:あなたのコメントを読んだ後、2つの提案があります。

提案 1

上記の私のソリューションを使用しますが"version DESC"、並べ替えのために使用し、古いバージョンに戻したい場合は、代わりに複製して最新バージョンにします。次に、すべての編集の履歴があり、必要ありません

クエリの順序に関しては、データベースに複合インデックスを追加するversionlesson_id、これは簡単な操作になります。また、スコープの呼び出し#firstは効率的LIMIT 1です。関心のあるレコードのみを照会してインスタンス化します。また、同じリクエストでこのメソッドを複数回使用する必要がある場合、クエリの結果は自動的にキャッシュされます。

提案 2

レッスンに属する_を設定しますが、混乱を避けるために :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 に答える