1

我试图通过 has_one 在两个模型之间建立直接关系,Client并且Address与模型没有直接关系,has_one :billing_address但与模型没有直接关系:ClientAddressContact

客户

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_addressor Client.billing_address,模型enum中的Address是允许查询的。其背后的原因是,ContactofClient将有两个地址记录,一个用于计费,一个用于运输,我希望通过关系快速访问

我在客户端模型中尝试过:

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

但是当在视图中时:

client.billing_address

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

4

1 回答 1

1

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

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

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

资源


更新

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

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

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

于 2015-04-23T14:59:57.033 回答