Rails 4 has_one通过where子句

时间:2015-04-23 14:27:50

标签: ruby-on-rails-4 has-one-through

我正在尝试通过两个模型之间的has_one建立直接关系,ClientAddress,如has_one :billing_address,但Client没有'与AddressContact有直接关系,模型:

客户端

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_addressenum模型中的Address是允许查询的内容。这背后的原因是因为Contact Client将有两个地址记录,一个用于计费,一个用于发货,我希望通过关系快速访问

我尝试使用客户端模型:

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

但在视图中我是:

client.billing_address

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

1 个答案:

答案 0 :(得分:1)

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

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

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

Source

<强>更新

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

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

我认为这是因为数据库中的:kind字段应该是INTEGER类型。