2015-09-17 2 views
0

Я использую Rails 4, и мне трудно понять, как настроить мои модели, чтобы один пользователь мог оставить отзыв для другого пользователя.Rails: отзывы пользователей от других пользователей

Я пытался следовать ответ на прикрепленном вопрос: 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' 

таблица обратной связи имеет атрибуты, называемые: comment (text),: reviewer (integer) и: created_at (datetime). Рецензент должен быть идентификатором пользователя, который оставил обратную связь.

Модель пользователя имеет атрибуты для: 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. Я получаю сообщение об ошибке, указывающей на первую строку выше (будучи <% если могут: читать, @feedback & & user.feedback.comment пустым%> Ошибка говорит, что ждет.!?. 'then' .Я никогда не использовал «тогда» раньше, и это не работает, когда я просто печатаю его после пробела.

  3. У меня есть целочисленный атрибут в моей таблице отзывов: рецензент. Я хочу сохранить пользователя id пользователя, который создал обратную связь (на другом пользователе) в этом поле.Я не знаю, как это сделать. Сообщение SO, скопированное выше, предлагает ввести строку в мою модель обратной связи, в которой говорится: has_one: reviewer,: class_name => 'User',: foreign_key => 'reviewer'. Я пробовал это, но я не может понять, что он делает.

Может ли кто-нибудь помочь? Возможно, есть еще один способ подойти к этой проблеме, и я был бы признателен за помощь в ее поиске. Сообщение SO, которое мне удалось найти, было проголосовано слишком широко, но я не могу найти никаких других ссылок с более конкретными аспектами этой проблемы.

ответ

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 
+0

Спасибо - плохо дайте ему попробовать и дайте вам знать – Mel

0

Класс обратной связи является объединением от пользователя-рецензента. На нем должно быть два внешних ключа. Для пользователя и рецензента. Сделайте их как own_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 принадлежит пользователю, но это не имеет смысла. Вместо этого сделайте это свойством.

Изменить рецензента на reviewer_id и добавить ее в модель обратной связи. Тогда метод рецензента, сгенерированный столбцом базы данных, не будет сбиваться с помощью метода рецензента, который исходит из свойства belongs_to.

После этого вы будете хорошо.

+0

Hi swards - я не понимаю. У меня нет модели рецензента. его просто атрибут в моей таблице обратной связи. У меня есть user_id в таблице обратной связи, но это указывает на то, что пользователь получает обратную связь. Вот почему обратная связь принадлежит пользователю (как у пользователя, который получает обратную связь) – Mel

+0

Справа - им нужен атрибут class_name для идентификации класса. Типично с моей стороны. Мы имеем в виду это как рецензент, но это действительно просто пользователь. – Swards

+0

Таким образом, отзыв в модели обратной связи будет присвоен идентификатор пользователя, так как ассоциация модели для рецензента указывает на модель пользователя? Большое спасибо за помощь – Mel

 Смежные вопросы

  • Нет связанных вопросов^_^