has_many, через ассоциацию Rails - PullRequest
0 голосов
/ 12 мая 2018

Здравствуйте. Мне нужна помощь в создании структуры для моей базы данных (PostgreSQL).

Я хочу создать коллекцию (запрос), которая может получить все комнаты определенной квартиры в здании .eg.

biulding.find(1).flats.find(1).rooms.

Как я могу структурировать свою ассоциацию для архивирования этого?

Спасибо

Вот модели

class Building < ApplicationRecord
  has_many :flats
  has_many :rooms, through: :flat
end


 class Flat < ApplicationRecord
  belongs_to :building
  has_many :rooms
end




class Room < ApplicationRecord
  belongs_to :flat
  belongs_to :building
end

схема

create_table "buildings", force: :cascade do |t|
    t.string "name"
   .....
  end

------------------

create_table "flats", force: :cascade do |t|
    t.string "number"
    t.bigint "building_id"
    t.bigint "room_id"
    t.index ["building_id"], name: "index_flats_on_building_id"
    t.index ["room_id"], name: "index_flats_on_room_id"
  end


-------------------------------


create_table "rooms", force: :cascade do |t|
    t.string "number"
    t.bigint "flat_id"
    t.bigint "building_id"
    t.index ["building_id"], name: "index_rooms_on_building_id"
    t.index ["flat_id"], name: "index_rooms_on_flat_id"
  end

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Ассоциация, кажется, в порядке, будь то для строительства в квартиру и наоборот.

Запрос коллекции, в нем будут перечислены все данные, соответствующие конкретному зданию и конкретной квартире:

Building.where(id: 1).joins(:flats).first.rooms.where("flats.flat_id = ?",1)

Надеюсь, это поможет !!

0 голосов
/ 12 мая 2018

Ваши ассоциации в порядке, чтобы делать то, что вы просите.
Если вы хотите получить комнаты для данной квартиры, вы можете сделать: Flat.find(id).rooms или flat.rooms, если вы уже установили переменную с именем квартира .

edit: я не могу ответить на комментарий из-за ограничения репутации, поэтому я отвечаю здесь.

Спасибо. Другой вопрос. Как запросить информацию о количестве комнат и квартир в здании

Вы можете сделать это, добавив метод .count к вашему запросу. Как flat.rooms.count или building.flats.count.

0 голосов
/ 12 мая 2018

Какая отправная точка? Если у вас есть квартира, вы можете сделать flat.rooms или Room.where(flat: flat) или Room.where(flat_id: id). Если у вас есть здание, вы можете сделать Building.find(1).rooms, если у вас есть has_many :rooms, through: :flats.

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