2016-03-19 22 views
0

Ich habe Probleme beim Abfragen zwischen Modellen in Rails. Ich habe eine Klasse Message, dass belongs_to: booking. Mein Ziel ist es, einen active Scope zu Message hinzuzufügen, der von einem Booking Scope abhängig ist.Verkettungsbereiche zwischen Modellen in 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 

Ich mag die Message s zu einem bestimmten Person gerichtet finden, wo die zugehörigen Bookingactive ist. Ich möchte daher die Booking.active beim Erstellen Message.active verwenden.

Aufruf Message.active(1) mit über Implementierung gibt die folgende Fehlermeldung:

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

Gibt es eine Möglichkeit, Booking.active bei der Umsetzung von Message.active verwenden kann und Message s zurückgegeben werden?

Antwort

1

Wenn Sie Bedingungen auf Assoziationen hinzufügen, Sie auch zu brauchen sie beitreten, nicht nur merge oder include sie, dh die folgenden sollte funktionieren:

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 

Es gibt nicht viel Dokumentation hierzu finden Sie this für weitere Informationen.

Verwandte Themen