Ruby on Rails - 需要帮助关联模型

时间:2013-02-02 20:34:44

标签: ruby-on-rails model-associations rails-models

好的,我仍然是铁轨上的红宝石的新手,试图学习我的方式。我有两个模型(用户模型和评论模型)。基本上,用户有一个简单的配置文件,其中包含“关于我”部分和同一页面上的照片部分。用户必须登录才能对其他用户个人资料发表评论。

我的用户模型

    class User < ActiveRecord::Base
        attr_accessible :email, :name, :username, :gender, :password, :password_confirmation
        has_secure_password
        has_many :comments
        .
        .
    end

我的评论模型

    class Comment < ActiveRecord::Base
       belongs_to :user
       attr_accessible :content
       .
       .
     end

在我的评论表中,我有一个user_id列,用于存储其个人资料已被评论的用户的ID,以及一个commenter_id列,用于存储用户在个人资料上发表评论的ID。

评论表

    <%= form_for([@user, @user.comments.build]) do |f| %>
      <%= f.text_area :content, cols: "45", rows: "3", class: "btn-block comment-box" %>
      <%= f.submit "Comment", class: "btn" %>
    <% end %>

我的评论控制器

    class CommentsController < ApplicationController
        def create
           @user = User.find(params[:user_id])
           @comment = @user.comments.build(params[:comment])
           @comment.commenter_id = current_user.id
           if @comment.save
             ......... 
           else
             .........
           end      
        end  
    end 

这可以很好地在数据库中存储user_idcommenter_id。在显示页面上显示用户评论时出现问题。我想获得评论特定个人资料的用户的姓名。

在我的用户控制器中

      def show
        @user = User.find(params[:id])
        @comments = @user.comments
      end

我想从commenter_id获取用户的名称,但在尝试undefined method 'commenter' for #<Comment:0x007f32b8c37430>之类的内容时,它会不断抛出错误comment.commenter.name。但是,comment.user.name工作正常,但它不会返回我想要的内容。我猜测没有正确的关联。

我需要帮助在模型中获取正确的关联,以便从commenter_id获取名称。

我的上一个问题,我如何在评论表中发现错误?它不像通常的form_for(@user)那样@user.errors.any?

的routes.rb

      resources :users do
         resources :comments, only: [:create, :destroy]
      end

1 个答案:

答案 0 :(得分:0)

在你的模特中尝试这样的事情

class User < ActiveRecord::Base
  has_many :received_comments, :class_name => "Comment", :foreign_key => "user_id"
  has_many :given_comments, :class_name => "Comment", :foreign_key => "commenter_id"
end

class Comment < ActiveRecord::Base
  belongs_to :user # comment about profile
  belongs_to :commenter, :class_name => "User", :foreign_key => "commenter_id"
end

结帐:http://guides.rubyonrails.org/association_basics.html

你可以在has_many集合中提出更好的命名,收到并给出的是我在短时间内可以做的最好的事情:)

注意:在许多情况下,foreign_key是选项,将其留在上面 - 我认为它有助于清晰

  • has_many fk是指许多表(其他表)中的列
  • belongs_to fk是指许多表(此表)中的列