Метод отношения Active Record для агрегирования связанных has_many - PullRequest
0 голосов
/ 20 ноября 2018

Рассмотрим эти две модели:

class User < ApplicationRecord
  has_many :blogs
end

class Blog < ApplicationRecord
  belongs_to :user
end

Я бы хотел сделать что-то подобное, но это не сработает:

my_users        = User.where(age: 35) 
all_assoc_blogs = my_users.blogs # errors out

Вот ошибка:

неопределенный метод `blogs 'для User :: ActiveRecord_Relation:

Я понимаю, почему он не работает: вы можете вызывать blogs только для одного user объекта.Вы не можете вызвать blogs для объекта отношения активной записи users.

В конечном счете, я хочу объект отношения активной записи, который состоит из совокупности всех блогов для всех пользователей в my_usersобъект отношения активной записи.Есть ли способ сделать это?Это единственный способ, которым я могу придумать, и он довольно уродливый:

my_users   = User.where(age: 35)
temp_blogs = []
my_users.each {|u| temp_blogs << u.blogs.to_a}
blog_ids = temp_blogs.flatten.pluck(:id)
Blog.where(id: blog_ids)

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

Может быть, это поможет вам:

Blog.joins(:user).where(user: User.where(age: :35))

или

Blog.joins(:user).merge(User.where(age: :35))
0 голосов
/ 20 ноября 2018

Активные записи, где Metrodome возвращает вам отношение активной записи, а не уникальный результат.Вам нужно:

my_users = User.where(age: 35).first

Тогда вы сможете получить блоги одного пользователя с:

my_users.blogs

Но если вы собираетесь вести все блоги разных пользователей,Вы должны попытаться:

my_user_ids = User.where(id: 35).pluck(:id)
Blog.where(user_id: my_user_ids)
0 голосов
/ 20 ноября 2018

Другие ответы верны, но вы можете сделать это более эффективно и уменьшить количество запросов к базе данных, например, так.

my_users = User.includes(:blogs).where(age: 35)  # this makes one db query to get all data
all_assoc_blogs = my_users.map(&:blogs)
0 голосов
/ 20 ноября 2018

Это было то, что я искал:

my_users = User.where(age: 35)
Blog.where(user: my_users)

Что меня сбило с толку, так это то, что мне пришлось переключать передачи. Сначала я беру соответствующий users, но затем передаю эти users в Blog запрос.

Поскольку в конечном итоге я хочу, чтобы отношение активных записей составляло blogs, самый простой способ - убедиться, что самая верхняя модель, с которой я начинаю в запросе, - это Blog.

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