Ruby on rails Rails:用户对其他用户的反馈

Ruby on rails Rails:用户对其他用户的反馈,ruby-on-rails,model-associations,Ruby On Rails,Model Associations,我使用的是Rails 4,我很难弄清楚如何设置我的模型,以便一个用户可以给另一个用户留下反馈 我已尝试按照所附问题的答案回答: 我的模型是:用户、个人资料、反馈 模型之间的关联是: 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 :

我使用的是Rails 4,我很难弄清楚如何设置我的模型,以便一个用户可以给另一个用户留下反馈

我已尝试按照所附问题的答案回答:

我的模型是:用户、个人资料、反馈

模型之间的关联是:

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'
反馈表具有名为:comment(text)、:reviewer(integer)和:created_at(datetime)的属性。审阅者需要是留下反馈的用户的用户id

用户模型具有:first\u name和:last\u 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> 

我想从上面看到的是向任何可以在用户(接收反馈)配置文件页面上阅读反馈的用户显示反馈。如果没有反馈或当前用户无法查看反馈,则应应用else语句

我对上述内容有几个问题:

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

  • 我收到一个指向上面第一行的错误(being)。错误表明它应该是'then'。我以前从未使用过'then',如果我只是在空白后键入它,它就不起作用了

  • 我的反馈表中有一个整数属性,名为:reviewer。我想存储创建反馈的用户的用户id(在另一个用户上)在那个领域。我不知道怎么做。上面复制的帖子建议我在我的反馈模型中放一行,上面写着:has_one:reviewer,:class_name=>'User',:foreign_key=>'reviewer'。我试过了,但我不明白它在做什么


  • 有人能帮忙吗?也许有另一种方法来解决这个问题,我会很感激你能帮我找到它。我找到的SO帖子被投票选得太广泛了,但我找不到任何其他关于这个问题的更具体方面的参考资料。

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

    class Feedback < ActiveRecord::Base 
      belongs_to :reviewer, polymorphic: true
      belongs_to :reviewable, polymorphic: true
    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
    

    反馈类是来自user reviewer的联接。它应该有两个外键。对于user和reviewer。使它们都属于

    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,它希望外键位于关联类上。按照您编写外键的方式,这意味着反馈id在用户身上,但这没有意义。请改为将其设置为“属于”

    将reviewer更改为reviewer\u id并将其添加到反馈模型中。这样,数据库列生成的reviewer方法将不会被来自所属对象的reviewer方法所破坏


    之后,你会很好。

    谢谢-我会尝试一下,让你知道Hi swards-我不明白。我没有审阅者模型。它只是我反馈表中的一个属性。我在反馈表中有用户id,但这引用了接收反馈的用户。这就是为什么反馈属于用户(与接收反馈的用户相同)对-他们需要class_name属性来识别类。我的部分输入错误。我们将其称为审阅者,但它实际上只是一个用户。因此,反馈模型中的审阅者id将被分配给用户id,因为审阅者的模型关联指向用户模型?非常感谢您的帮助嘿-我正在尝试查看这是否rks,但我仍然收到这个错误?一些帖子说这意味着我缺少了一个或我有一个太多了。语法错误,意外的tIDENTIFIER,需要关键字\u then或“;”或“\n”…&@user.feedback.comment。!blank实际上我用and替换了&&(我认为它们可以互换).但现在我得到了这个错误:nil:NilClass的未定义方法'feedback'
    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