2015-04-23 128 views
1

我試圖建立兩個模型,ClientAddress作爲has_one:billing_address之間通過HAS_ONE有直接關係,但Client沒有直接關係AddressContact確實,型號:軌道4 HAS_ONE通過與where子句

客戶

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_address,在enumAddress模型是什麼將允許查詢。背後的原因是因爲ClientContact將有兩個地址記錄,一個用於計費和一個用於運輸和我想通過關係快速訪問

我在客戶端模式的嘗試:

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

但是,當在視圖I O:

client.billing_address 

我得到一個undefined method to_sym' for nil:NilClass我似乎無法化解它, 謝謝。

+0

你在用什麼數據庫? – mahatmanich

回答

0

由於無法推斷,因此您需要在關聯上指定:source

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

沒有:source,它要尋找一個:billing_address協會在Contact模型。

Source


更新

enum docs讀了之後,它看起來像你可能需要修改的範圍,直接引用映射:

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

我相信這是因爲01數據庫中的字段預計爲INTEGER

+0

感謝您的答案我沒有得到錯誤了,但似乎我仍然有工作要做,因爲它無法找到記錄 SELECT'addresses'。* FROM'addresses' INNER JOIN' contacts' ON'addresses'.' contact_id' ='contacts'.'id' WHERE'addresses'.'kind' ='billing'和'contacts'。'id' = 34限制1 =>無 – SORRROW

+0

我加了一點信息,希望有所幫助。 – deefour

+0

您的更新使其工作完美,感謝您的幫助! – SORRROW