2015-03-22 2 views
0

У меня возникли проблемы с простым отношением has_many. Я пытаюсь вернуть уникальные объекты, но поскольку я помещаю ограничения на объект в середине отношений, я получаю неопределенный метод в своем ActiveRecord_AssociationRelation.Возвращение уникального объекта из ассоциации активных записей

у меня есть:

class Customer < ActiveRecord::Base 
has_many :session_enrollments 
has_many :session_details, through: :session_enrollments 


class SessionDetail < ActiveRecord::Base 
has_many :customers, through: :session_enrollments 
belongs_to :trainer 

class Trainer < ActiveRecord::Base 

has_many :session_details 
has_many :session_enrollments, through: :session_details 
has_many :customers, through: :session_enrollments 


class SessionEnrollment < ActiveRecord::Base 

belongs_to :customer, :foreign_key => "customer_id" 
belongs_to :session_detail, :foreign_key => "session_detail_id" 

Я пытаюсь вернуть все тренеры, которые имеют текущий сеанс с клиентом через:

Customer.rb 

@trainers = self.session_details.where(state: ["CONFIRMED"]).trainers 

Но где оператор загружает активный объект записи об ассоциации. Как я могу включить это условие и все еще возвращать уникальных тренеров?

+0

Что такое 'self' в этой строке? – Almaron

+0

Клиент, извините, что в Customer.rb – DaynaJuliana

ответ

1

Попробуйте это:

@trainers = Trainer.joins(:session_details, :customers).where(session_details: {state: "CONFIRMED"}).where(customers: {id: self.id}).distinct 
+0

Приятным прикосновением, но он не рассматривает клиента где-либо ... – Almaron

+0

Обновлено, посмотрите, является ли это вашим ответом. –

+0

@SharvyAhmed это работает, но есть ли способ вернуть только уникальные значения!? то есть .uniq? – DaynaJuliana

1

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

@trainers = self.includes(:session_details => :trainer).where(session_details: {state: ["CONFIRMED"]}) 

Этот запрос будет возвращать клиенту вместе с их сессии детали с соответствующими тренерами

+0

Извините @RSB, я изменил '@ session_details_array' на' @ тренеров' Так как это было сбивает с толку. Кроме того, состояние находится в модели 'session_detail' – DaynaJuliana

+1

И я считаю, что' state' является свойством 'SessionDetail' – Almaron

1

Я хотел бы попробовать это:

@trainers = Trainer.joins(session_details: [:session_enrollments]).where(session_details: {state: 'CONFIRMED'}).where(session_enrollments: {customer_id: self.id}).distinct 
+0

Вам не обязательно вступать в' session_enrollments', так как Trainer имеет прямую связь с 'customers' и' session_details'. –

+0

Ну, 'joins (: customer)' в любом случае нужно будет присоединяться к 'session_enrollments', мой путь всего лишь 1 присоединяется короче. – Almaron

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