Rails模型关联

时间:2012-06-17 00:40:52

标签: ruby-on-rails ruby

我正在尝试在rails中设计模型关联 由以下3种类型组成:

评论员,博客文章和评论

- >它是“评论员”,而不是“用户”是什么意思 他们不是创建博客帖子的用户...... 相反,他们只创建评论。

虽然评论员之间的基本关系 评论很明显:

class Commentator < ActiveRecord::Base
    has_many :comments

class Comment < ActiveRecord::Base
    belongs_to: comments

我不确定如何将“Blogpost”与此相关联...... - &GT;我想能够要求所有的Blogposts 评论员和所有评论员都离开了 一个特定的Blogpost。

因为这是一种多对多的关系 会使用:

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 由我自己进入评论表的相应字段?

我认为最好将Blogposts作为 因为关系可以通过元素 在评论员创建评论时自动构建。 (除了评论员不能创建评论这一事实 到不存在的Blogposts ...) 但是,评论的评论员不会是多对多的 关系,我再也不能使用“has_many ...... through”了。

将这3种模型联系起来的好方法是什么?

1 个答案:

答案 0 :(得分: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

向现有博客帖子添加评论(假设我们有blogcommentator个变量)

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

OR

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

注意

我会使用一个模型并分配权限,而不是为用户使用两个模型(即用户和评论者) 区分评论员和博客作者。

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")