garthcn

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

  •  
  •   garthcn · Feb 9, 2011 · 7364 views
    This topic created in 5573 days ago, the information mentioned may be changed or developed.
    这两天在写一个类似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 replies    1970-01-01 08:00:00 +08:00
    roamlog
        1
    roamlog  
       Feb 9, 2011
    不太对吧,user 怎么可能是在这时候 create 呢?这时候只是处于登入状态吧?

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

    @user 可以用 before_filter 预先查出来...
    chloerei
        2
    chloerei  
       Feb 9, 2011
    是不是定义了attr_accessible但是没有包涵post?

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

    @comment = @user.comments.new(:content => "foo")
    @commnet.post = @post
    @comment.save
    chloerei
        3
    chloerei  
       Feb 9, 2011
    # in comment.rb
    attr_accessible :content

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

    不过一般是用 new(params[:comment]) 比较简洁(参数通常不少),这时候就必须把关联的键排除出attr_accessible,不然容易被用户提交危险数据(比如没有评论权限的文章id)。关联用手动set。
    garthcn
        7
    garthcn  
    OP
       Feb 10, 2011
    @chloerei
    Thanks!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3843 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 10:24 · PVG 18:24 · LAX 03:24 · JFK 06:24
    ♥ Do have faith in what you're doing.