这一定是一种非常常见的情况,但我无法弄清楚:
我有一个多态注释模型,一个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。出于安全原因,我不想这样做...有没有办法以另一种方式关联评论和用户?
感谢所有帮助者!
答案 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),在路由中显示加密密钥并解密密钥以获取正确的对象。
总而言之,您仍然需要公开一个属性来唯一标识您的帖子对象。