rails 5 - область действия с #or и #joins: как обойти ограничения? - PullRequest
0 голосов
/ 11 июня 2018

User имеет много Posts

Post имеет много Comments

User имеет много Comments

class Post < ApplicationRecord
  ..stuff...

  scope :created_by, ->(user) { where(creator: user) }
  scope :with_comments_by, ->(user) { joins(:comments).where('comments.creator_id = ?'. user.id) }
  ##########========= this is my failure:
  scope :related_to, ->(user) { created_by(user).or(with_comments_by(user) }

(немои настоящие модели, просто придерживающиеся базовой структуры SO)

Эта последняя область не работает, так как ясно отмечено :

Два отношения должныбыть структурно совместимыми, они должны охватывать одну и ту же модель, и они должны отличаться только ГДЕ или ИМ.

Итак, как мне обойти это?( пожалуйста не говорите грязного, длинного предложения SQL)

Я хочу иметь возможность позвонить Posts.related_to(user) и получить одну коллекцию ActiveRecord всех сообщений, которые пользователь создал или прокомментировал .


Я шел по этому пути, но я знаю, что это извращение:

class Post < ApplicationRecord
  ..stuff...

  scope :created_by, ->(user) { where(creator: user) }
  scope :with_comments_by, ->(user) { joins(:comments).where('comments.creator_id = ?'. user.id) }
  ##########========= this is my failure:
  # scope :related_to, ->(user) { created_by(user).or(with_comments_by(user) }

  def self.related_to(user)
    ary = []
    ary << Post.created_by(user).map(&:id)
    ary << Post.with_comments_by(user).map(&:id)
    Post.find(ary.uniq)
    # so...bad...so yucky
  end

Помогите мне, ТАК сообщество.Я в ловушке в своем собственном уме.

1 Ответ

0 голосов
/ 11 июня 2018

Ваш with_comments_by объем не совсем то, что вы хотите.В этой области должен быть поиск сообщений, комментарии которых содержат комментарий от user, поэтому вы должны точно сказать, что:

scope :with_comments_by, ->(user) { where(id: Comment.select(:post_id).where(creator_id: user.id)) }

Вы можете использовать эту область с or в related_to безлюбые жалобы.

Эта версия with_comments_by также аккуратно позаботится о дублирующих сообщениях, которые может создать ваш JOIN, если кто-то несколько раз прокомментировал одно сообщение.

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