Похоже, у вас есть модельное отношение:
class Client < ActiveRecord::Base
has_many :patients, :through => :enrollments
has_many :enrollments
end
class ClientPatient < ActiveRecord::Base
belongs_to :client
belongs_to :patient
end
class Patient < ActiveRecord::Base
has_many :clients, :through => :enrollments
has_many :enrollments
end
Чтобы применить ваше ограничение, я бы сделал это в ActiveRecord, чтобы вы получали надлежащую обратную связь при попытке сохранить запись, которая нарушает ограничение.Я бы просто изменил вашу модель ClientPatient следующим образом:
class Enrollment < ActiveRecord::Base
belongs_to :client
belongs_to :patient
validates_uniqueness_of :patient_id, :scope => :client_id
end
Будьте осторожны, потому что, хотя это отлично подходит для небольших приложений, оно все же подвержено возможным условиям гонки, как описано здесь: http://apidock.com/rails/v3.0.5/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of в разделе "Параллельность и целостность"
Как они там описывают, вы также должны добавить уникальный индекс в таблицу в базе данных.Это обеспечит два немедленных преимущества:
- Проверка правильности и любые поиски в этой модели на основе этих двух идентификаторов будут выполняться быстрее (поскольку они проиндексированы)
- Ограничение уникальности будетбыть принудительно установленным на стороне DB, и в редких случаях состояния гонки вы не получите неверные данные, сохраненные в базе данных ... хотя пользователи получат 500 Server Error, если вы не уловите ошибку.
В файле миграции добавьте следующее:
add_index :enrollments, [:patient_id, :client_id], :unique => true
Надеюсь, это было полезно:)
Редактирование (исправлены некоторые проблемы с именами и пара очевидных ошибок):
Тогда найти данные, которые вы ищете, очень просто:
Client.find_by_name("Bob Smith").patients
Patient.find_by_name("Henry Person").clients