0

次の3つのタイプで構成されるレールのモデルの関連付けを設計しようとしています。

コメンテーター、ブログ投稿、コメント

->これは「ユーザー」ではなく「コメンテーター」です。つまり、ブログ投稿を作成するユーザーではなく、コメントのみを作成します。

コメンテーターとコメントの基本的な関係は明らかですが、

class Commentator < ActiveRecord::Base
    has_many :comments

class Comment < ActiveRecord::Base
    belongs_to: comments

「Blogpost」をこれに関連付ける方法がわかりません...->コメンテーターが残したすべてのBlogpostと、特定のBlogpostのすべてのCommentatorを要求できるようにしたいと思います。

これは多対多の関係なので、私は次のように使用します。

class Commentator < ActiveRecord::Base
    has_many :comments
    has_many :blogposts, :through => :comments

class Blogpost < ActiveRecord::Base
    "has_many :commentators, :through => :comments

コメンテーターがブログ投稿を作成するとき、コメントテーブルの対応するフィールドに自分でcommenentator_idとblogpost_idをコメントに書き込む必要がありますか?

コメンテーターがコメントを作成するときに関係が自動的に構築される可能性があるため、通過要素としてブログ投稿を使用する方がよいと思います。(コメンテーターが存在しないブログ投稿にコメントを作成できないという事実は別として...)しかし、コメンテーターからコメントへのコメントは多対多の関係ではなく、「has_many...through」を使用できなくなります。

この3種類のモデルを関連付ける良い方法は何ですか?

4

1 に答える 1

2

記載されている問題の解決策

class Commentator < ActiveRecord::Base
  has_many :comments
  has_many :blogposts, :through => :comments
end

class Comment < ActiveRecord::Base
  belongs_to  :commentator 
  belongs_to  :blogpost  
end

class Blogpost < ActiveRecord::Base
  has_many :comments
  has_many :commentators, :through => :comments
  belongs_to :user

class User
  has_many :blogposts
end

blog既存のブログ投稿にコメントを追加するには (とcommentator変数があると仮定します)

blog.comments.create(:commentator => commentator, :comment => "foo bar") 

また

commentator.comments.create(:blog => blog, :comment => "foo bar")   

ノート

ユーザーに対して 2 つのモデル (ユーザーとコメント投稿者) を使用する代わりに、1 つのモデルを使用して権限を割り当て、コメント投稿者とブログ投稿ライターを区別します。

class User
  has_many :blogs
  has_many :comments
  has_many :commented_blogs, :through => :comments, :source => :blog
end

class Blog
  has_many :comments
  belongs_to :user
  has_many :commenters, :through => :comments, :source => :user
end

class Comment
  belongs_to :user
  belongs_to :blog
end  
  • ブログエントリの作成:

    if current_user.has_role?(:blog_writer)
      current_user.blogs.create(params[:blog])
    end
    
  • コメントを追加する:

    current_user.comments.create(:blog => blog, :content => "foor bar")
    

    また

    blog.comments.create(:user => current_user, :content => "foor bar")
    
于 2012-06-17T05:35:52.690 に答える