Ruby on Rails: own_to и has_many над одной и той же парой на одной модели - PullRequest
0 голосов
/ 09 марта 2011

Во-первых, мои определения модели:

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 установлено допустимое значение.

Я открыт для предложений по другим подходам.

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Вы могли бы рассмотреть плагин act_as_list. Тогда в сертификате модель:

belongs_to :certificate_series
acts_as_list :scope => certificate_series
0 голосов
/ 09 марта 2011

Вы должны создать метод, который возвращает последний сертификат в серии.Вам не нужно создавать другие отношения для этого.

class Certificate < ActiveRecord::Base
  belongs_to :certificate_series
end

class CertificateSeries < ActiveRecord::Base
  has_many :certificates

  def last_certificate_in_series
    certificates.last
  end
end
0 голосов
/ 09 марта 2011

На самом деле вам не нужна дополнительная belongs_to ассоциация.Звучит очень естественно, что последний сертификат в certificate_series.certificates - это тот, который вам нужен.Так что вы можете просто сделать это:

class Certificate < ActiveRecord::Base
  belongs_to :certificate_series
end

class CertificateSeries < ActiveRecord::Base
  has_many :certificates
end

certificate_series.certificates.last
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...