1

次のように、routes.rbにネストされた2つのリソースが必要であると仮定します。

resources :post do
  resources :comment
end

慣例により、 comments.idはコメントの主キーになり、comments.post_id外部キーになります。

主キー複合キー [comments.post_id、comments.id]である必要があります。

id == 1の個別の投稿の最初のコメントをすべて持つことができるように、id==2の個別の投稿の2番目のコメントごとに...

もちろん、コメント(子リソース)を参照するすべてのルートを、その投稿(親リソース)も参照せずに無効にする必要があります。

これは単なる例です。私の実際のプロジェクトはブログに関するものではありません(この問題は別の方法で処理しました)。互換性を実現するために、ネストされたリソースに対してこのような動作を実現する方法があるかどうかを知りたいです。レガシーデータベースを使用します。

ありがとうございました。

4

3 に答える 3

3

これを行う1つの方法は、別の列を作成し(posts.idを主キーのままにします)、スコープを使用してその列の一意性検証を投稿IDに追加し、_createhoodの前後に書き込みを行ってその列の値を生成することです。 。

例(実際のコードではありません)

class Comment < ActiveRecord::Base
  ...
  validates_uniqueness_of :sub_id, :scope => :post_id

  before_create do
    this.sub_id = post.comments.size + 1
  end
end

したがって、sub_id列は主キーとして機能します。特定の投稿のコメントをクエリするときは、次のようにします。

post.comments.where(:sub_id => val).first

また

post.comments.find_by_sub_id(val)

ここでの実際のロジックは、要件を満たすように調整する必要があることに注意してください。たとえば、コメントを削除できる場合は、次のsub_idを決定する(またはsub idジェネレータークラスを作成する)ために使用されるカウンターを投稿に保持することをお勧めします。

于 2011-12-11T14:35:31.820 に答える
1

実際、私はあなたが何を達成しようとしているのか、そしてその理由はよくわかりません。たぶん、あなたはそれを少し明確にするために風邪をひきます。とにかく役立つかもしれない2つのリンク:

Railsの複合主キー

Railsアソシエーション

したがって、可能であれば、上記の2番目のリンクで説明されているように3番目のモデルを使用して実装します。それが不可能な場合は、最初のリンクに記載されている宝石を試してみることをお勧めします。

于 2011-12-11T13:36:12.110 に答える
0

補足:おそらくロジックアラ

before_create do this.sub_id = post.comments.size + 1 end

コメントの削除を適切に処理してバックアップする必要があります。そうしないと、すぐに重複するsub_idに遭遇します。

于 2013-05-15T13:02:40.200 に答える