Как сделать запрос записей, которые имеют вложение ActiveStorage? - PullRequest
0 голосов
/ 20 сентября 2018

Учитывая модель с ActiveStorage

class User 
  has_one_attached :avatar
end

Я могу проверить, есть ли у одного пользователя аватар

@user.avatar.attached? 

Но как я могу вернуть коллекцию всех пользователей с (или всемипользователи без) вложения?

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

Я уверен, что пропускаю что-то очевидное.Можно ли сделать что-то вроде:

User.where(attached_avatar: nil)

И если да, то где это задокументировано?

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Немного о том, как выполнить поиск по вложенным записям:

def self.search_name(search)
  with_attached_attachment.
    references(:attachment_attachment).
    where(ActiveStorage::Blob.arel_table[:filename].matches("%#{search}%"))
end

Вам просто нужно обновить with_attached_attachment и :attachment_attachment, чтобы отразить вашу подключенную модель.В моем случае у меня есть has_one_attached :attachment

И для тех, кому интересно, Arel #matches, похоже, не подвержен атакам SQL-инъекций.

0 голосов
/ 14 августа 2019

Я хотел знать, есть ли в записи какие-либо вложения (у меня было несколько вложений, например, паспорт и другие документы для User), чтобы я мог отобразить / скрыть раздел в пользовательском интерфейсе.

На основе ответа здесь Я смог добавить следующий метод к ApplicationRecord:

def any_attached?
  ActiveStorage::Attachment.where(record_type: model_name.to_s, record_id: id).any?
end

Затем вы можете использовать его следующим образом:

User.last.any_attached?
#=> true
0 голосов
/ 26 сентября 2018

Соглашение для имен ассоциаций вложений

Ассоциации привязок именуются с использованием следующего соглашения:

<NAME OF ATTACHMENT>_attachment

Например, если у вас есть has_one_attached :avatar, тогда ассоциацияимя будет avatar_attachment.

Запрос вложений Active Storage

Теперь, когда вы знаете, как называются ассоциации вложений, вы можете запрашивать их, используя joins, как и любую другую ассоциацию Active Record.

Например, учитывая класс User ниже

class User
   has_one_attached :avatar
end

Вы можете запросить для всех User записей, которые имеют это вложение , следующим образом

User.joins(:avatar_attachment)

Выполняется INNER JOIN, который возвращает только те записи, которые имеют вложение.

Вы можете запросить все User записи, которые НЕ имеют этого вложения , как это

User.
  left_joins(:avatar_attachment).
  group(:id).
  having("COUNT(active_storage_attachments) = 0")
...