Rails has_one 有多个列 - has_many 和 has_one 问题
Rails has_one with multiple columns - has_many and has_one issue
正在尝试针对此问题提出 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 * 来自证书,其中 ca_id = {ca.id} AND serial = {ca.serial}
进一步说明 CA 和证书之间的关联 -
- 单个 CA 有一个证书来标识自己
- 一个 CA 有多个颁发给最终用户的证书
- CA 根据自己的顺序颁发证书。为简单起见,从 1 开始(CA 的证书将具有序列号 1,CA 颁发的最终用户证书将从 2 开始)。
- 证书属于 CA 的 :ca_id 和 :serial
- 存储了多个 CA。这意味着两个证书可以具有相同的序列号但属于两个不同的 CA。
为什么要这样建模?好吧,证书就是证书。无论证书标识的是 CA 还是最终用户,其含义结构和特征都是相似的。
似乎 has_one 是直截了当的,但我尝试了各种使用范围的方法,但都无济于事。
当然,我可以并且已经在 cas 模型中创建了一个 'cert()' 方法,但似乎应该可以建立关联。
您可以定义一个has_one,范围为:
class 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
正在尝试针对此问题提出 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 * 来自证书,其中 ca_id = {ca.id} AND serial = {ca.serial}
进一步说明 CA 和证书之间的关联 -
- 单个 CA 有一个证书来标识自己
- 一个 CA 有多个颁发给最终用户的证书
- CA 根据自己的顺序颁发证书。为简单起见,从 1 开始(CA 的证书将具有序列号 1,CA 颁发的最终用户证书将从 2 开始)。
- 证书属于 CA 的 :ca_id 和 :serial
- 存储了多个 CA。这意味着两个证书可以具有相同的序列号但属于两个不同的 CA。
为什么要这样建模?好吧,证书就是证书。无论证书标识的是 CA 还是最终用户,其含义结构和特征都是相似的。
似乎 has_one 是直截了当的,但我尝试了各种使用范围的方法,但都无济于事。
当然,我可以并且已经在 cas 模型中创建了一个 'cert()' 方法,但似乎应该可以建立关联。
您可以定义一个has_one,范围为:
class 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