V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
garthcn
V2EX  ›  Ruby on Rails

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

  •  
  •   garthcn · 2011-02-09 03:15:30 +08:00 · 6579 次点击
    这是一个创建于 5018 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这两天在写一个类似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的答案。

    谢谢!
    7 条回复    1970-01-01 08:00:00 +08:00
    roamlog
        1
    roamlog  
       2011-02-09 11:14:37 +08:00
    不太对吧,user 怎么可能是在这时候 create 呢?这时候只是处于登入状态吧?

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

    @user 可以用 before_filter 预先查出来...
    chloerei
        2
    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
        3
    chloerei  
       2011-02-09 13:05:26 +08:00
    # in comment.rb
    attr_accessible :content

    # in controller
    @comment = @user.comments.new(params[:comment])
    garthcn
        4
    garthcn  
    OP
       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
        5
    garthcn  
    OP
       2011-02-09 15:48:33 +08:00
    @roamlog
    我是在console里面用这三行测试关联。先建立一个user,然后建立一个post,再用这个user创建关于这个post的comment。总是没法同时关联comment-post and comment-user。
    同上,手动可以set,但是似乎不是好习惯。
    chloerei
        6
    chloerei  
       2011-02-09 18:24:41 +08:00
    像你的代码这样指定了每个 :key => value 就没事

    不过一般是用 new(params[:comment]) 比较简洁(参数通常不少),这时候就必须把关联的键排除出attr_accessible,不然容易被用户提交危险数据(比如没有评论权限的文章id)。关联用手动set。
    garthcn
        7
    garthcn  
    OP
       2011-02-10 15:07:35 +08:00
    @chloerei
    Thanks!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.