#ruby-on-rails #ruby #activerecord
#ruby-on-rails #ruby #activerecord
Вопрос:
У меня есть три модели. User
, Application
и ApplicationVote
Верно следующее:
ApplicationVote
принадлежит как aUser
, так и anApplication
.User
Может проголосовать заApplication
, тем самым создаваяApplicationVote
- Пользователь может голосовать за любое количество приложений, но может иметь только один голос за приложение.
Если бы был способ сказать User has_many ApplicationVotes but only one per Application
… как бы это выглядело?
Ответ №1:
Что-то вроде этого
уровень приложения, в application_vote.rb
файле модели
validates_uniqueness_of :application_id, scope: :user_id
уровень базы данных в файле миграции
add_index :application_votes, [:user_id, :application_id], unique: true
Комментарии:
1. Спасибо! А в моделях? Просто пользователь имеет_many ApplicationVotes? Вот где я больше всего запутался.
2. Я бы сказал
has_many :application_votes
. Не более одного на приложение, но в целом у него / нее может быть много3. Еще раз спасибо! Можете ли вы просветить меня относительно того, зачем нужен индекс?
4. не доверяйте прикладному уровню 🙂 уровень базы данных — единственный, который может дать вам желаемую гарантию
5. если вы получаете много одновременных запросов, уровень приложения может иногда завершаться сбоем