Во-первых, мои определения модели:
class Certificate < ActiveRecord::Base
belongs_to :certificate_series
end
class CertificateSeries < ActiveRecord::Base
has_many :certificates
belongs_to :last_certificate_in_series, :class_name => "Certificate", :foreign_key => :last_certificate_in_series_id
end
Я думал об ассоциации как: у CertificateSeries есть много сертификатов и есть сертификат, который является последним в серии. Я думал об использовании have_one, но в соответствии с основами ассоциации , have_one неверен в зависимости от того, куда я положил ассоциирующий ключ.
Вы можете думать об этом, как каждый раз, когда вы получаете новый паспорт, физический паспорт меняется (с изменением даты его выдачи и истечения срока действия), но это все еще паспорт. Таким образом, у вас может быть много физических паспортов (сертификатов), но у вас есть только 1 настоящий паспорт (последний в серии, который является физическим паспортом), и физические паспорта принадлежат к классу «паспортов» идентификаторов (серии сертификатов) .
Я хочу, чтобы я мог вызвать CertificateSeries.last_certificate_in_series, и он вернет последний сертификат в серии. Я думал сделать это на уровне базы данных, имея поле last_certificate_in_series_id. Я хотел сделать это таким образом, чтобы уменьшить накладные расходы на базу данных, просто получив последнюю в серии. Другой подход, о котором я подумал, - получить все сертификаты в серии, упорядочить их по дате и получить самый последний.
Таким образом, у меня сейчас возникают проблемы, пытаясь отразить эту связь в моделях.
belongs_to :last_certificate_in_series, :class_name => "Certificate", :foreign_key => :last_certificate_in_series_id
, кажется, не определяет это должным образом. Я могу вызвать CertificateSeries.last_certificate_in_series, но он возвращает только nilClass, даже если для last_certificate_in_series_id установлено допустимое значение.
Я открыт для предложений по другим подходам.