Rails has_one有多个列 - has_many和has_one问题

时间:2015-01-21 14:06:06

标签: ruby-on-rails associations

尝试针对此问题提出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拥有标识自己的证书
  • 单个CA拥有向最终用户颁发的多个证书
  • CA根据自己的顺序颁发证书。为简单起见,从1开始(CA的证书将具有序列1,CA颁发的最终用户证书将从2开始)。
  • 证书属于CA:ca_id和:serial
  • 存储多个CA.这意味着两个证书可以具有相同的序列,但属于两个不同的CA.

Illustration

为什么要这样建模?那么,证书就是证书。无论证书是CA还是最终用户,意义结构和功能都是相似的。

似乎像has_one一样直截了当但我尝试了各种使用范围的方法,但无济于事。

当然,我可以并且已经在cas模型中创建了一个'cert()'方法,但它似乎应该是一种关联。

1 个答案:

答案 0 :(得分:3)

可以定义范围为:

的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