2013-11-19 6 views
0

У меня есть три модели:Ассоциация не работает

Департамент

class Department < ActiveRecord::Base 
    has_many :patients, :dependent => :destroy 
    has_many :waitingrooms, :dependent => :destroy 
end 

Waitingroom с полями patient_id:integer и department_id:integer

class Waitingroom < ActiveRecord::Base 
    belongs_to :patient 
end 

Пациент с department_id:integer

class Patient < ActiveRecord::Base 
    belongs_to :department 
    has_many :waitingrooms 
end 

Я сохраняю зал ожидания после того, как пациент был в приемной! Так что теперь я пытался извлечь пациентов, где в в waitingroom отдела:

def index 
    @waited = @current_department.waitingrooms.patients 
    end 

Как-то оно не работал он вернулся эту ошибку:

undefined method `patients' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Waitingroom:0x374c658> 

Но это сработало: Что я не так? Благодаря!

def index 
    @waited = @current_department.waitingrooms 
    end 
+1

Я подвергаю сомнению ваши ассоциации ... Как зал ожидания принадлежат к одному пациенту, в то время как пациент имеет * много комнат * ожидания? Вы рубите своих людей и ставите один человек на номер? – meagar

+0

Хорошо, что вы правы! Я скучаю по этому! –

ответ

2

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

def index 
    rooms = @current_department.waitingrooms 
    @waited = rooms.map { |r| r.patients } 
end 

Если вы хотите плоский массив, вы могли бы (как наивный первый проход) использовать rooms.map { |r| r.patients }.flatten.uniq. Лучше бы просто попытка создать список идентификаторов пациента и после выборки пациентов:

@waited = Patient.where(id: rooms.pluck(:patient_id).uniq) 
+0

Спасибо! Теперь это работает! У меня есть еще один маленький вопрос: быстрее ли второе предложение? Я имею в виду? Или почему я должен использовать его? Еще раз спасибо –

+1

Да, возможно ** много ** быстрее. – meagar

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