2015-05-17 2 views
0

Я ищу правильный синтаксис для решения проблемы ниже. У меня есть 3 модели: Пользователь, клиент, счетRails извлекает связанный объект через

class Account 
belongs_to :client 
belongs_to :user 
end 

class User 
has_many :clients 
has_many :accounts, through: :clients 
end 

class Client 
belongs_to :user 
has_many :accounts 

Я хочу, чтобы создать контроллер для извлечения всех счетов Пользователя через модель клиента. Я попробовал следующее (строка 1):

client = current_user.clients 

, который извлекает все «клиентов», которые принадлежат к «User» (я проверил в консоли). Однако я не смог найти правильный синтаксис для следующей строки, чтобы получить все «Учетные записи», связанные с этими «Клиентами». Я попытался (строка 2)

@accounts = client.accounts 

но я получаю сообщение об ошибке «Неопределенный метод». Не могли бы вы дать мне правильный синтаксис? Благодарю.

+0

Вам необходимо выполнить итерацию по вашему массиву объектов-клиентов. работает 'client.first.accounts'? – Cyzanfar

ответ

0

Ваш «клиент» представляет собой массив из множества клиентов.

Во-первых, измените клиент на клиенты, чтобы сделать этот факт более явным.

clients = current_user.clients 

Вы не можете вызвать метод учетных записей в массиве, поэтому ваш метод не работает. Вместо этого вам нужно выполнить итерацию по массиву, в свою очередь, вызвать ваши учетные записи методов на каждом клиенте.

Это должно работать, или будет близко.

@accounts = Array.new 
clients.each do |client| 
    @accounts += client.accounts 
end 
0

Если у вас есть такие модели, как:

class User < ActiveRecord::Base 
    has_many :clients 
    has_many :accounts, through: :clients 
end 

class Client < ActiveRecord::Base 
    belongs_to :user 
    has_many :accounts 
end 

class Account < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :user 
end 

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

User.first.clients.select('*').joins(:accounts).to_a 

Это может быть проще сделать, сделав Клиента настоящей «модель объединения», но в некотором смысле эта свободная связь кажется немного более управляемой.

+1

'User.first' не обязательно' current_user'. обратите внимание, что переменная 'client' равна« current_user.clients » – Cyzanfar

+0

абсолютно верно, просто для этого для удобства – errata

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