Оцените пост только один раз за пользователя в рельсах - PullRequest
0 голосов
/ 24 августа 2018

У меня проблема с разрешением пользователям оценивать сообщение.Моя задача - дать пользователю возможность оценить пост только один раз.На странице шоу у меня есть радио-кнопки для рейтинга.Если пользователь пытается оценить во второй раз, ему необходимо обновить предыдущую оценку, сделанную пользователем для того же сообщения.Проблема, с которой я сталкиваюсь, заключается в том, что пользователь может оценивать сообщение несколько раз.Как решить эту проблему?

Модель пользователя:

class User < ApplicationRecord
  has_many :posts
  has_many :ratings
end

Модель поста:

class Post < ApplicationRecord
  has_many :ratings
  belongs_to :user
end

Рейтинги модели

class Rating < ApplicationRecord
  belongs_to :post
  belongs_to :user
end

В контроллерах постая использовал вложенные атрибуты для рейтингов.

def show
  @post = @topic.posts.find(params[:id])
  @rate = @post.ratings.all
  @rate = Rating.where(post_id: @post.id).group("rate").count
end

private def post_params
  params.require(:post).permit(:title, :body, ratings_attributes: [:rate])
end

Страница показа поста включает создание рейтинга с использованием <fieldset>:

<%= form_for [@topic, @post] do |f| %>
  <%= f.fields_for :ratings, @post.ratings.build do |builder| %>
    <fieldset>
      <% for i in 1..5 %>
        <%= builder.radio_button :rate, i %><%= i %>
      <% end %>
    </fieldset>
  <% end %>
  <%=f.submit "Rate" %>
<% end %>

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете использовать сначала или инициализировать, как это

   @rating=Rating.where(post_id: @post.id,user_id: current_user).first_or_initialize
0 голосов
/ 24 августа 2018

Во-первых, добавьте валидацию в рейтинг, чтобы обеспечить уникальность комбинации пользователя и поста.Это остановит создание дублирующего рейтинга.

validates_uniqueness_of :post_id, scope: :user_id

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

@rating = Rating.find_or_initialize_by(user: @user, post: @post)
@rating.rate = params[:rate]
@rating.save

Возможно, это не идеальный синтаксис, но вы должны понять, что вы пытаетесь сделать, и настроить его в соответствии с вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...