尝试针对此问题提出has_one关联。我有两张桌子:
Ca:
:id
:serial
...
Cert:
:id
:ca_id
:serial
...
给定的cas.id有许多证书,但cas只有一个证书(:ca_id,:serial)。我不需要has_many关联,但确实需要has_one,以便我可以使用ca.cert引用CA的证书。我需要has_one来创建类似以下查询的内容:
SELECT * FROM certs where ca_id = {ca.id} AND serial = {ca.serial}
进一步说明CA与证书之间的关联 -
为什么要这样建模?那么,证书就是证书。无论证书是CA还是最终用户,意义结构和功能都是相似的。
似乎像has_one一样直截了当但我尝试了各种使用范围的方法,但无济于事。
当然,我可以并且已经在cas模型中创建了一个'cert()'方法,但它似乎应该是一种关联。
答案 0 :(得分:3)
您可以定义范围为:
的has_oneclass Ca < ActiveRecord::Base
has_many :certs
has_one :cert, ->{ joins(:ca).where('cas.serial = certs.serial')}
end
class Cert < ActiveRecord::Base
belongs_to :ca
end
现在
Ca.first.cert
为证书提供匹配的序列号 但它比定义更优雅或更多Rails:
class Ca < ActiveRecord::Base
has_many :certs
def cert
certs.where(serial: serial)
end
end