我使用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语句。
我有以上几个问题:
我不知道如何遍历模型以链接到反馈。反馈部分显示在配置文件显示页面中。反馈属于用户,个人资料属于用户。
我收到错误指向上面的第一行(&lt;%if can can ?:read,@ feedback&amp;&amp; user.feedback.comment。!blank?%&gt;。错误说是期待&#39;然后&#39;我以前从未使用过&#39;然后在我空白后输入它时它不起作用。
我的反馈表中有一个名为:reviewer的整数属性。我想存储在该字段中创建反馈的用户的用户ID(在另一个用户上)。我不知道该怎么做。上面复制的SO帖子建议我在我的反馈模型中添加一行说明:has_one:reviewer,:class_name =&gt; &#39;用户&#39;,:foreign_key =&gt; &#39;评&#39 ;.我试过了,但我无法理解它在做什么。
有人可以帮忙吗?也许有另一种方法可以解决这个问题,我很乐意帮助找到它。我确实找到的SO帖子投票过于宽泛,但我找不到任何其他参考文献,并提出了更具体的问题。
答案 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的审阅者方法破坏。
在那之后,你会很好。