2010-12-28 13 views
0

Ich habe Probleme, diese Zuordnung zwischen meinen Modellen einzurichten.Hat eine Beziehung durch vier Modelle?

Ein Benutzer hat viele Unterkünfte und Unterkünfte haben einen Benutzer.

Unterkünfte haben viele Benachrichtigungen und Benachrichtigungen haben eine Unterkunft.

Anfragen haben viele Benachrichtigungen.

Wie kann ich es so einrichten, dass ich alle Anfragen für einen bestimmten Benutzer (dh Benutzer -> Unterkünfte (jeweils) -> Benachrichtigung -> Anfrage) bekommen kann?

Update:

Hier ist meine aktuelle Controller-Datei:

class PanelController < ApplicationController 

    before_filter :login_required 

    def index 
    @accommodations = current_user.accommodations.all 
    @requests = Array.new 
    @accommodations.each do |a| 
     a.notifications.each do |n| 
     @requests << Request.where('id' => n.request_id) 
     end 
    end 

    end 

end 

Und Modelle:

models/user.rb

class User < ActiveRecord::Base 
    [snip] 
    has_many :accommodations 
    has_many :notifications, 
      :through => :accommodations 
end 

Modelle/accommodation.rb

class Accommodation < ActiveRecord::Base 
    validates_presence_of :title, :description, :thing, :location, :spaces, :price, :photo 
    attr_accessible :photo_attributes, :title, :description, :thing, :location, :spaces, :price 
    has_one :photo 
    has_many :notifications 
    belongs_to :user 
    accepts_nested_attributes_for :photo, :allow_destroy => true 
end 

models/notification.rb

class Notification < ActiveRecord::Base 
    attr_accessible :accommodation_id, :request_id 
    has_one :request 
    belongs_to :accommodation 
end 

models/request.rb

class Request < ActiveRecord::Base 
    belongs_to :notifications 
    attr_accessible :firstname, :lastname, :email, :phone, :datestart, :dateend, :adults, :children, :location, :status 
    validates_presence_of :firstname, :lastname, :email, :phone, :datestart, :dateend, :children, :adults, :location 
end 
+0

senden Sie Ihre Modelldateien bitte – sethvargo

+0

Sie nicht habe die Assoziationen noch: P Ich glaube nicht, dass es irgendwas wert ist, zu posten. Wenn ich falsch liege, lass es mich wissen und ich werde sie aufschreiben! –

+0

Wenn du "have one" schreibst, meinst du wirklich "gehört" zu Recht? – jdl

Antwort

1

So etwas sollte funktionieren:

@reqs = []  
@user.accommodations.all.each do |a| 
    @reqs << a.notification.request 
end 

dies Unter der Annahme korrekt ist:

class User 
    has_many :accommodations 
end 

class Accommodation 
    belongs_to :user 
    has_many :notifications 
end 

class Notification 
    belongs_to :accomodation 
    belongs_to :request 
end 

class Request 
    has_many :notifications 
end 

has_many :through Verwendung wird nicht für mehrere Modelle funktionieren, wie hier zu sehen: Ruby-on-Rails: Multiple has_many :through possible?

Aber Sie können in Ihrem Benutzermodell etwas tun:

class User 
    has_many :accommodations 
    has_many :notifications, 
      :through => :accommodations 

    def requests 
     self.notifications.all.collect{|n| n.request } 
    end 
end 
+0

Danke Codethis. Ich dachte darüber nach etwas in diese Richtung zu implementieren. Allerdings wurde mir gesagt, dass es einen "richtigen" Weg gibt, dies zu tun ... Etwas wie has_many: notifications,: through =>: accommodations? –

+0

Aus irgendeinem Grund bekomme ich ein Array zurückgegeben, das wie folgt aussieht: # #

+0

das funktioniert für mich - können Sie Ihren Code oben veröffentlichen? ist es genau so? – zsalzbank

Verwandte Themen