Есть отношения через четыре модели? - PullRequest
0 голосов
/ 28 декабря 2010

У меня возникают проблемы с установкой этой связи между моими моделями.

У пользователя много вариантов проживания, а в номерах одного пользователя.

В местах размещения много уведомлений, а в уведомлениях - одно место размещения..

У запросов много уведомлений.

Как я могу сделать так, чтобы я мог получить все запросы для данного пользователя (то есть, Пользователь -> Размещение (каждый) -> Уведомление)-> Запрос)?

Обновление:

Вот мой текущий файл контроллера:

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

И модели:

модели / user.rb

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

модели / размещение.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

модели / уведомления.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

1 Ответ

1 голос
/ 28 декабря 2010

Примерно так должно работать:

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

Предполагая, что это правильно:

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 не будет работать для нескольких моделей, как показано здесь: Ruby-on-Rails: несколько has_many: через возможно?

Но вы можете сделать что-то подобное в своей пользовательской модели:

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

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