Как вы возвращаете модель-посредник при объединении нескольких моделей в Rails? - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь выяснить, как сделать запрос к activerecord и получить список объектов, соединяясь через другие объекты.

Вот упрощенный пример.

class Person < ApplicationRecord
  has_many :wearings
  has_many :shirts, through :wearings
end

class Wearing < ApplicationRecord
  belongs_to :shirt
  belongs_to :person
  #has wear date + other attributes
end

class Shirt < ApplicationRecord
  scope :white, -> {where(white:true)}
  scope :large, -> {where(large:true)}
  scope :sleeves, -> {where(sleeves:true)}
end

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

Я могу вернуть рубашки как:

shirts = person.shirts.white.large

Я хотел бы иметь возможность выполнять один и тот же запрос с использованием областей, но вместо этого получить обратно подмножество person.wearings, которое включает большие белые рубашки.

Это в Rails 5.

1 Ответ

0 голосов
/ 30 июня 2018

Я знаю 2 способа реализовать это. Оба они выдают один и тот же запрос SQL. Мы можем добавить одну из следующих областей к Wearing:

scope :by_white_shirts, -> { joins(:shirt).where(shirts: { white: true }) }

или используя объединить

scope :by_white_shirts, -> { joins(:shirt).merge(Shirt.white) }

результат будет такой:

person.wearings.by_white_shirts
>>   Wearing Load (0.6ms)  SELECT  "wearings".* FROM "wearings" INNER JOIN
     "shirts" ON "shirts"."id" = "wearings"."shirt_id" WHERE 
     "wearings"."person_id" = ? AND "shirts"."white" = ? LIMIT ?  
     [["person_id", 1], ["white", 1], ["LIMIT", 11]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...