【问题标题】:Ruby on Rails - Need help associating modelsRuby on Rails - 需要帮助关联模型
【发布时间】:2013-02-02 20:34:44
【问题描述】:

好的,我仍然是 ruby​​ on rails 的新手,试图了解我的方法。我有两个模型(用户模型和评论模型)。基本上,用户有一个简单的个人资料,其中包含“关于我”部分和同一页面上的照片部分。用户必须登录才能评论其他用户的个人资料。

我的用户模型

    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

在我的 cmets 表中,我有一个 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 %>

我的 cmets 控制器

    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 存储在数据库中。在显示页面上显示用户 cmets 时出现了我的问题。我想获取对特定个人资料发表评论的用户的姓名。

在我的用户控制器中

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

我想从commenter_id 获取用户名,但是当我尝试comment.commenter.name 之类的东西时,它会不断抛出错误undefined method 'commenter' for #&lt;Comment:0x007f32b8c37430&gt;。但是,comment.user.name 工作正常,但它没有返回我想要的。我猜我没有得到正确的关联。

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

我的最后一个问题,如何捕捉 cmets 表单中的错误?它不是通常的form_for(@user),你喜欢@user.errors.any?

routes.rb

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

【问题讨论】:

  • 在你的评论类中,你可以添加一个带有自定义名称和外键的“自定义”关系:belongs_to :commenter, foreign_key: 'user_id', class_name: 'User'
  • 见这里:api.rubyonrails.org/classes/ActiveRecord/Associations/…(他们的例子是 Person Author 和 Post)我给你的你应该能够做到 comment.commenter 并且如果存在,这应该返回一个 User 对象

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


【解决方案1】:

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

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 指many表(其他表)中的列
  • belongs_to fk 指的是 many 表(此表)中的列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多