Дизайн модели Rails

Я хочу создать модель, подобную reddit, где пользователи могут повышать или понижать уровень ссылки или статьи. У меня возникают проблемы с обволакиванием моей головы: как я сделал свои модели, чтобы пользователь мог проголосовать вверх или вниз по ссылке только один раз и иметь возможность изменить свою шахту (переключиться на нижний уровень), но никогда не сможет проголосовать за несколько раз независимо от того, сколько времени прошло/вышло, не имеет значения

2 ответа

has_many: через

Вы создали бы что-то вроде этого:

#app/models/post.rb
Class Post < ActiveRecord::Base
 has_many :votes do
 def user(user)
 find_by user_id: user.id
 end
 end
 has_many :voters, through: votes, class_name: "User", foreign_key: "user_id"
end

#app/models/vote.rb
Class Vote < ActiveRecord::Base
 belongs_to :post
 belongs_to :user
end

#app/models/user.rb
Class User < ActiveRecord::Base
 has_many :votes
 has_many :posts, through: :votes
end

Стандарт has_many :through отношения - дает вам возможность использовать join model объединения для объединения двух или нескольких других моделей вместе:

-

пользователь

Это позволит вам вызвать следующее:

#app/views/posts/show.html.erb
<% if @post.votes.user(current_user).present? %>
 <% link_path = @votes.votes.user(current_user).value == "up" ? vote_down_path : vote_up_path %>
 <%= link_to "Vote", link_path %>
<% else %>
 # empty vote link
<% end %>

Сложный бит - связать единый голос с одним пользователем - поэтому я включил расширение ActiveRecord Association для вашей ассоциации votes


Вы можете использовать отношения для захвата этого...

  • В статье много голосов
  • Голосование принадлежит Пользователю
  • Голосование имеет одну статью
  • В статье есть много избирателей (пользователей) через голосования, но они должны быть уникальными. (правило проверки)

licensed under cc by-sa 3.0 with attribution.