Ассоциации Rails: что-то имеет много, но только одно на другой объект

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

У меня есть три модели. User , Application и ApplicationVote

Верно следующее:

  1. ApplicationVote принадлежит как a User , так и an Application .
  2. User Может проголосовать за Application , тем самым создавая ApplicationVote
  3. Пользователь может голосовать за любое количество приложений, но может иметь только один голос за приложение.

Если бы был способ сказать 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. если вы получаете много одновременных запросов, уровень приложения может иногда завершаться сбоем