Rails 4 has_one 通过where子句

Rails 4 has_one through with where clause

我正在尝试通过 has_one 在两个模型 ClientAddress 之间建立直接关系,如 has_one :billing_addressClientAddress 没有直接关系,Contact 有,模型:

客户端

class Client < ActiveRecord::Base
 belongs_to :contact
 accepts_nested_attributes_for :contact
end

联系

class Contact < ActiveRecord::Base
 has_one :client

 has_many :addresses, dependent: :destroy
 accepts_nested_attributes_for :addresses, allow_destroy: true
end

地址

class Address < ActiveRecord::Base
 belongs_to :contact

 enum kind: [:address, :shipping, :billing]
end

所以我想要的是能够执行 Client.shipping_addressClient.billing_addressAddress 模型中的 enum 将允许查询。这背后的原因是因为 ClientContact 将有两个地址记录,一个用于账单,一个用于运输,我想通过关系快速访问

我在客户端模型中试过:

has_one(:billing_address, -> { where(kind: :billing) }, class_name: Address, through: :contact)

但是当我在视图中时:

client.billing_address

我收到一个 undefined method to_sym' for nil:NilClass 我似乎无法解决它,谢谢。

您需要在关联上指定 :source,因为无法推断它。

has_one :billing_address, through :contact, source: :addresses, -> { where(kind: :billing) }

如果没有 :source,它将在 Contact 模型上寻找 :billing_address 关联。

Source


更新

阅读 enum docs 后,您可能需要修改范围,直接引用映射:

-> { where(kind: Address.kinds[:billing]) }

我相信这是因为数据库中的 :kind 字段应为 INTEGER.

类型