Rails:用户对其他用户的反馈

时间:2015-09-17 04:55:08

标签: ruby-on-rails model-associations

我使用Rails 4并且无法确定如何设置我的模型,以便一个用户可以为其他用户留下反馈。

我试图按照所附问题的答案:rails 4 users reviews for users how to do this

我的模特是:用户,个人资料,反馈

模型之间的关联是:

User.rb
has_one :profile
has_many :feedbacks
accepts_nested_attributes_for :feedbacks

Profile.rb: belongs_to :user

Feedback.rb: 
belongs_to :user
  has_one :reviewer, :class_name => 'User', :foreign_key => 'reviewer'

反馈表具有以下属性:注释(文本),:审阅者(整数)和:created_at(日期时间)。审阅者需要是留下反馈的用户的用户ID。

用户模型具有以下属性:first_name和:last_name。

在我的个人资料展示页面中,我有一个指向反馈部分的链接:

<%= render "feedbacks/feed" %> 

那部分有:

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">

      <% if can? :read, @feedback && @user.feedback.comment.!blank %>
       <%= @profile.user.feedbacks.each do |feedback|%>

        <div class="row">
            <div class="col-md-10 col-md-offset-1">

                <%= @feedback.comment %>

            </div>
        </div>
        <div class="row">
            <div class="col-md-3">
                <div class="logobox">
                <%= "#{@user.feedback.reviewer.first_name} #{@user.feedback.reviewer.last_name}" %>

                </div>

            </div>

            <div class="col-md-3">
                <div class="logobox">
                <%= @feedback.try(:created_at).try(:strftime, '%d %B %Y') %>
                </div>
            </div>
            <% end %>
        <% else %>
            <%= render html: "No feedback available".html_safe %>   
        </div>

      <% end %>
    </div>
  </div>
</div> 

我想从上面得到的是向任何能够阅读用户反馈(接收反馈)个人资料页面的用户显示反馈。如果没有反馈或current_user无法查看反馈,则应该应用else语句。

我有以上几个问题:

  1. 我不知道如何遍历模型以链接到反馈。反馈部分显示在配置文件显示页面中。反馈属于用户,个人资料属于用户。

  2. 我收到错误指向上面的第一行(&lt;%if can can ?:read,@ feedback&amp;&amp; user.feedback.comment。!blank?%&gt;。错误说是期待&#39;然后&#39;我以前从未使用过&#39;然后在我空白后输入它时它不起作用。

  3. 我的反馈表中有一个名为:reviewer的整数属性。我想存储在该字段中创建反馈的用户的用户ID(在另一个用户上)。我不知道该怎么做。上面复制的SO帖子建议我在我的反馈模型中添加一行说明:has_one:reviewer,:class_name =&gt; &#39;用户&#39;,:foreign_key =&gt; &#39;评&#39 ;.我试过了,但我无法理解它在做什么。

  4. 有人可以帮忙吗?也许有另一种方法可以解决这个问题,我很乐意帮助找到它。我确实找到的SO帖子投票过于宽泛,但我找不到任何其他参考文献,并提出了更具体的问题。

2 个答案:

答案 0 :(得分:0)

我的方法一直是使用多态关联。创建一个多态模型。

class Feedback < ActiveRecord::Base 
  belongs_to :reviewer, polymorphic: true
  belongs_to :reviewable, polymorphic: true
end

在我的多态模型设置完成后,我会创建您可以在用户模型中包含为行为的关注点。

module Reviewer
  extend ActiveSupport::Concern

  included do
    has_many :given_reviews, as: :reviewer, dependent: :destroy
  end
end

module Reviewable
  extend ActiveSupport::Concern

  included do
    has_many :received_reviews, as: :reviewable, dependent: :destroy
  end
end

您的用户模型应如下所示。

class User
  include Reviewer #user is behaving as a reviewer
  include Reviewable #user is behaving as a reviewable entity
end

设置完所有这些后,您就可以使用可重复使用的模块,该模块也适用于任何其他模型。

userA.given_reviews #reviews posted by the user A
userA.received_reviews #reviews other people have given about user A

答案 1 :(得分:0)

反馈类是来自用户评论者的加入。它应该有两个外键。对于用户和审阅者。让他们都属于all_to。

User.rb
  has_one :profile
  has_many :feedbacks
  has_many :reviewers, :through => :feedbacks, :class_name => 'User'
  has_many :created_feedbacks, :class_name => 'Feedback', :foreign_key => 'reviewer_id'
  has_many :reviewed_users, :through => :feedbacks_left, :source => :user, :class_name => 'User'
  # Not sure if you need accepts nested attributes.

Feedback.rb: 
  belongs_to :user
  belongs_to :reviewer, :class_name => 'User' # foreign_key should be reviewer_id

注意 - 如果使用has_one或has_many,则期望外键位于关联类上。在你编写的方式中,这意味着feedback_id在用户身上,但这没有意义。改为使其成为belongs_to。

将审核者更改为reviewer_id并将其添加到反馈模型中。然后,数据库列生成的审阅者方法不会被来自belongs_to的审阅者方法破坏。

在那之后,你会很好。