2016-03-19 2 views
0

У меня возникли проблемы с запросами между моделями в Rails. У меня есть класс Message, который belongs_to: booking. Моя цель - добавить область active в Message, что зависит от области Booking.Цепочные области между моделями в Rails

class Booking < ActiveRecord::Base 
    has_one :event 
    has_many :messages 

    def self.active 
    includes(:event). 
     where('events.endtime >= ? AND status IS NOT ?' 
      Time.current.beginning_of_week,    
      statuses['canceled']) 
    end 
end 

class Message < ActiveRecord::Base 
    belongs_to :booking 
    belongs_to :person 

    self.active(person_id) 
    where(person_id: person_id).merge(Booking.active) 
    end 
end 

Я хочу найти Message сек, направленные на конкретную Person где ассоциированная Booking является active. Поэтому я хочу использовать Booking.active при создании Message.active.

Message.active(1) Вызов с выше реализацией возвращает следующее сообщение об ошибке:

Association named 'event' was not found on Message; perhaps you misspelled it?

Есть ли способ, что я могу использовать Booking.active в реализации Message.active и получить Message s вернулся?

ответ

1

Если вы добавляете условия на ассоциациях, вы также должны присоединиться к ним не только merge или include их, то есть должны работать:

class Booking < ActiveRecord::Base 
    # ... 
    def self.active 
    joins(:event). 
     where('events.endtime >= ? AND status IS NOT ?' 
      Time.current.beginning_of_week,    
      statuses['canceled']) 
    end 
end 

class Message < ActiveRecord::Base 
    # ... 
    self.active(person_id) 
    where(person_id: person_id).joins(:booking).merge(Booking.active) 
    end  
end 

Существует не так много документации по этому вопросу см this для получения дополнительной информации.

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