Как построить запрос, который проверяет, существует ли связь - PullRequest
0 голосов
/ 21 октября 2019

Я создаю приложение Rails 5. В этом приложении я получил модель пользователя и модель подписки. Я хочу иметь возможность получить всех пользователей, которые получили активную подписку.

Пользователь

has_one: подписка

- id,
- name
- email

Подписка

Proper_to: пользователь

- id
- user_id
- title
- active (boolean)

Мне нужно иметь возможность сделать запрос, как это (ниже). Другими словами, мне нужно найти всех пользователей, которые не только получили подписку, но и для атрибута active установлено значение true.

User.with_active_subscriptions

Я думаю, что, возможно, мне нужно сделать Scope, но не знаю, как это сделать. сделай это.

Ответы [ 2 ]

5 голосов
/ 21 октября 2019

Я бы предложил вам сначала написать область действия в Subscription модели:

scope :active, ->{ where(active: true) }

Затем вы можете использовать вышеуказанную область действия в своем классе пользователя.

scope : with_active_subscriptions, ->{ joins(:subscription).merge(Subscription.active) }

Iпредпочитайте такой способ написания кода, так как active является свойством класса Subscription. Пользовательский класс не должен быть обеспокоен этим. Таким образом, ваш код будет лучше структурирован, и если вам нужно изменить функциональность активной области, это нужно сделать только в одном месте.

2 голосов
/ 21 октября 2019

Это довольно просто, на самом деле, все, что вам нужно сделать, это использовать joins:

scope :with_active_subscriptions, lambda {
  joins(:subscription).where(subscriptions: { active: true })
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...