Как получить родителей на основе записей их ребенка - PullRequest
0 голосов
/ 02 июля 2018

У меня есть две модели, такие как

company.rb

class Company < ApplicationRecord
     has_many :posts
end

post.rb

class Post < ApplicationRecord
    belongs_to :company

    scope :notClosed, -> {where(closed: false)}
    scope :published, -> {where(published: true)}
end

Я хочу получить компании, у которых есть хотя бы один пост с соответствующим постом scope

В настоящее время мои запросы

Company.where(company_type: "Private").all

Это возвращает все компании, но как изменить этот запрос для моих нужд.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018
published_post_companies = Company.joins(:posts).distinct.merge(Post.published)
notClosed_post_companies = Company.joins(:posts).distinct.merge(Post.notClosed)
0 голосов
/ 02 июля 2018

Это даст вам все компании (один раз) с хотя бы одним постом, который «не закрыт»:

Company.includes(:posts).joins(:posts).where(company_type: "Private").merge(Post.notClosed)
0 голосов
/ 02 июля 2018

Явный способ Rails: получить идентификаторы компаний из области действия Post и запросить эти идентификаторы:

Company.where(id: Post.published.pluck(:company_id).uniq)

Заметьте, однако, что это может быть дорого, если у вас огромное количество постов. Может быть более эффективный способ использования SQL.

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