2015-04-23 3 views
1

Я пытаюсь установить прямую связь через has_one между двумя моделями, Client и Address как в has_one:billing_address но Client не имеет прямого отношения к Address, Contact делает, модели:Rails 4 has_one через с, где положение

Client

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_address или Client.billing_address, тем enum в Address модели, что позволит запрос. Причина это потому, что Contact из Client будет иметь два адресных записей, один для выставления счетов и один для судоходства, и я хочу, быстрый доступ через отношения

Я попытался в модели клиента:

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


Update

После прочтения вверх на enum docs, это выглядит, как вы, возможно, потребуется изменить область, ссылающийся на отображение непосредственно:

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

Я считаю, что это потому, что :kind Поле в базе данных должно быть типа INTEGER.

+0

Спасибо за ответ. Я больше не получаю ошибку, но, похоже, у меня все еще есть работа, потому что она не может найти записи. ВЫБОР 'адресов'. * FROM' адреса' INNER JOIN 'контакты' ON' addresses'.' contact_id' = 'contacts'.'id' WHERE' address'.'kind' = 'billing' AND 'contacts'.'id' = 34 LIMIT 1 => nil – SORRROW

+0

Я добавил немного больше информации, которая, надеюсь, поможет. – deefour

+0

Ваше обновление заставляет работать отлично, спасибо за вашу помощь! – SORRROW

Смежные вопросы