首先,我的模型定义:
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。
我愿意接受有关其他方法的建议。
答案 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