通过与多个关联的关联来创建

时间:2013-10-15 14:01:14

标签: ruby-on-rails polymorphism associations

这一定是一种非常常见的情况,但我无法弄清楚:

我有一个多态注释模型,一个Post模型和一个User模型。 这是我的关联设置:

class Post < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class User < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  attr_accessible :content

  belongs_to :commentable, polymorphic: true
  belongs_to :user
end

现在,我不希望commentable_id和user_id都是attr_accesible,因为我不希望它们受到大规模分配。我知道解决方案是通过关联创建注释,但是我如何为这两个关联做到这一点?

修改

实施例: 我在帖子中,我想创建一个评论。假设我有user_id。这样做的方法是:

@post.comments.create(user_id: 1, content: "bla bla")

这会有效,但我必须将Comment的user_id设为attr_accessible。出于安全原因,我不想这样做...有没有办法以另一种方式关联评论和用户?

感谢所有帮助者!

1 个答案:

答案 0 :(得分:0)

以下是您的需求:

user has_many :posts
user has_many :comments, :through :posts

post has_many :comments
post belongs_to :user

comment belongs_to :user
comment belongs_to :post

用户是帖子和评论的共同实体。仅当帖子存在时,用户才能对帖子发表评论(因此用户,评论和帖子之间的has_many_through关系)。我认为其余的关系是非常自我解释的。

示例:

user.posts.create(<post params>)

user.posts.find(1).comments.create(<comment params>)

user.posts #retrieve all posts
user.posts.find(1).comments #retrieve all comments by a user on the first post 

<强>更新

评论非用户拥有的帖子:

post = Post.find(params[:id]) 
user.comments.create(post_id => post.id, <other params>)

更新2

检索post对象以更改基础数据非常重要。您可以在posts表中添加一个新列,例如key(生成十六进制值),该列具有与post的id一对一的映射。您还可以修改路由以显示此密钥,而不是默认的帖子ID。 即,改变

/posts/:id, /posts/:id/edit

/posts/:key, /posts/:key/edit

现在,您可以使用密钥检索post对象,并使用它执行所需的任何操作。您的用户现在无法更改网址以更改帖子ID。为了使其更加健壮,您可以加密密钥(签出crypt gem),在路由中显示加密密钥并解密密钥以获取正确的对象。

总而言之,您仍然需要公开一个属性来唯一标识您的帖子对象。