Как найти, где has_one: через ассоциацию не ноль в Rails - PullRequest
0 голосов
/ 08 марта 2020

На нашем сайте есть изображения, которые пользователи могут выбрать в качестве изображений профиля для своих учетных записей. Вот соответствующие строки в моделях:

class User < ApplicationRecord
  has_one :profile_image, dependent: :destroy
  has_one :image, through: :profile_images
  accepts_nested_attributes_for :profile_image, allow_destroy: true
end

class Image < ApplicationRecord
 has_many :profile_images, dependent: :destroy
  has_many :users, through: :profile_images
end

class ProfileImage < ApplicationRecord
  belongs_to :image
  belongs_to :user
  validates  :user_id,  presence: true, allow_nil: false, uniqueness: true
  validates  :image_id, presence: true, allow_nil: false
end

Я бы хотел добавить опцию в представление индекса пользователя, чтобы показывать только пользователей с изображениями профиля. Я ищу с where.not(profile_image: nil) в контроллере, но я просто возвращаю всех пользователей.

В консоли я могу подтвердить, что у меня есть пользователи с и без изображений профиля:

>> User.first.profile_image
=> nil
>> User.second.profile_image
=> #<ProfileImage id: 2, image_id: 9, user_id: 6, created_at: "2019-10-26 17:52:37", updated_at: "2019-10-26 17:52:37">

Но я получаю те же итоги от User.all.count и User.where.not(profile_image: nil).count.

Ответы [ 4 ]

1 голос
/ 08 марта 2020

Установите и используйте where_exist gem

gem 'where_exists'

User.where_exists(:profile_image)
0 голосов
/ 08 марта 2020

has_one не имеет идентификатора изображения, хранящегося в таблице пользователей. Следовательно, ваш исходный запрос является иррациональным.

Итак, основываясь на вашем описании, я бы предложил подсчитать изображения (has_one означает, что каждое изображение принадлежит одному пользователю)

ProfileImage.count

Кажется, слишком просто, чтобы быть правдой, не правда ли?

0 голосов
/ 08 марта 2020

Я думаю, что это должно работать:

User.joins(:profile_image)

По умолчанию joins создает запрос INNER JOIN SQL в Ruby на Rails. Это означает, что он будет возвращать только те записи, которые связаны с записями в другой таблице.

Это значение по умолчанию может использоваться в этом случае, потому что тот факт, что у пользователя нет изображения профиля, означает, что profile_image не будет связано с этим пользователем.

0 голосов
/ 08 марта 2020

Попробуйте включить отношения:

User.includes(:profile_image).where.not(profile_image: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...