Как создать отношение has_many между двумя моделями, с несколькими моделями между ними? (Ruby on Rails ActiveRecord) - PullRequest
1 голос
/ 21 августа 2009

То, что я хотел бы сделать, это соединить одну модель с другой, используя две промежуточные модели. Вот абстракция:

Country has_many Companies
Company has_many Buildings, Company belongs_to Country
Building has_many Rooms, Building belongs_to Company
Room belongs_to Building

Я хочу иметь возможность использовать Country.first.rooms, поэтому я подумал, что модель Country будет такой простой, как:

class Country < ActiveRecord::Base
  has_many :companies
  has_many :buildings, :through=>:companies
  has_many :rooms, :through=>:buildings
end

Однако, это пытается сгенерировать SQL как: SELECT * FROM rooms INNER JOIN buildings ON rooms .building_id = building .id WHERE ((building .country_id = 1))

Очевидно, building.country_id не существует. Как мне обойти это?

Ответы [ 3 ]

1 голос
/ 21 августа 2009

Встроенные методы ассоциации вам здесь не помогут. Вам нужно явно построить запрос, используя соединения:

class Country - ActiveRecord::Base

    has_many :companies
    has_many :buildings, :through=>:companies

    def rooms
      Room.all :joins => { :building => { :company => :country } }, :conditions => { "countries.id" => id }
    end

end

Это потребует установки ассоциаций принадлежностей на моделях Building и Company

0 голосов
/ 24 апреля 2016

Это возможно после Rails 3.1. Приведенный ниже код работает для меня. Важно указывать has_many на каждом уровне.

class Country
  has_many :companies
  has_many :buildings, through: :companies
  has_many :rooms, through: buildings
end

class Company
  has_many :buildings
end

class Building
  has_many :rooms
end

class Room
end
0 голосов
/ 22 августа 2009

Попробуйте использовать Вложено много от

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...