Rails里面三个model:user/post/comment 的asssociation关系

2011-02-09 03:15:30 +08:00
 garthcn
这两天在写一个类似blog的网站,现在有三个model:user, post, comment

目前的关系是这样:
User.rb
has_many :comments
has_many :posts

Post.rb
has_many :comments
belongs_to :user

Comment.rb
belongs_to :user
belongs_to :post

但是我在创建新comment的时候,没法把comment跟user和post同时关联起来。
我用的是:
user = User.create(...)
post = user.posts.create(...)
comment = user.comments.create(:content => "foo", :post => post)
执行完之后,comment的user_id可以正确关联,但是post_id还是空的。

求助……
在stackoverflow里问了, http://bit.ly/g1C9hz ,但是还没有working的答案。

谢谢!
6428 次点击
所在节点    Ruby on Rails
7 条回复
roamlog
2011-02-09 11:14:37 +08:00
不太对吧,user 怎么可能是在这时候 create 呢?这时候只是处于登入状态吧?

@comment = @post.comments.build(params[:comment])
@comment.user = @user

@user 可以用 before_filter 预先查出来...
chloerei
2011-02-09 13:03:27 +08:00
是不是定义了attr_accessible但是没有包涵post?

不过还是建议attr_accessible不允许把关联放在hash里面提交,防止被钻漏洞提交危险数据

@comment = @user.comments.new(:content => "foo")
@commnet.post = @post
@comment.save
chloerei
2011-02-09 13:05:26 +08:00
# in comment.rb
attr_accessible :content

# in controller
@comment = @user.comments.new(params[:comment])
garthcn
2011-02-09 15:45:00 +08:00
@chloerei
attr_accessible里面确实没有包含post_id。
如果把post_id放进去,执行:

@comment = @user.comments.new(:content => "foo", :post_id => @post.id)

可以把@comment和@user and @post同时关联起来,但是就像你说的,这方法是不是不太安全?我刚开始学rails所以不太确定。如果有不用手动建立post关联的,当然最好。
garthcn
2011-02-09 15:48:33 +08:00
@roamlog
我是在console里面用这三行测试关联。先建立一个user,然后建立一个post,再用这个user创建关于这个post的comment。总是没法同时关联comment-post and comment-user。
同上,手动可以set,但是似乎不是好习惯。
chloerei
2011-02-09 18:24:41 +08:00
像你的代码这样指定了每个 :key => value 就没事

不过一般是用 new(params[:comment]) 比较简洁(参数通常不少),这时候就必须把关联的键排除出attr_accessible,不然容易被用户提交危险数据(比如没有评论权限的文章id)。关联用手动set。
garthcn
2011-02-10 15:07:35 +08:00
@chloerei
Thanks!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/8164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX