Ruby on Rails:在同一模型上的同一对上的belongs_to和has_many

时间:2011-03-09 03:47:04

标签: ruby-on-rails activerecord

首先,我的模型定义:

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,但根据association basics,has_one根据我放置关联键的位置不正确。

您可以将其视为每次获得新护照时,实体护照正在发生变化(其签发和到期日更改)但仍然是护照。因此,您可以拥有大量的实体护照(证书),但您只有1本护照(系列中的最后一本,即实体护照),而实体护照属于“护照”类ID(证书系列)

我想要的是我可以调用CertificateSeries.last_certificate_in_series,它将返回该系列中的最后一个证书。我想通过使用字段last_certificate_in_series_id在db级别中执行此操作。我想这样做是为了减少刚刚获得系列中最后一个的数据库开销。我想到的另一种方法是获取系列中的所有证书,按日期排列,并获得最新的证书。

因此,我现在在尝试在模型中反映这种关联时遇到了问题。

belongs_to :last_certificate_in_series, :class_name => "Certificate", :foreign_key => :last_certificate_in_series_id

似乎没有正确定义它。我可以调用CertificateSeries.last_certificate_in_series,但即使last_certificate_in_series_id设置为有效值,它也只返回一个nilClass。

我愿意接受有关其他方法的建议。

3 个答案:

答案 0 :(得分:1)

您可以考虑使用acts_as_list插件。 然后在证书模型中:

belongs_to :certificate_series
acts_as_list :scope => certificate_series

答案 1 :(得分:0)

实际上,您不需要额外的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

答案 2 :(得分:0)

您应该创建一个返回最后一个证书的方法。您无需为此创建另一种关系。

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