создать конкретную область применения HABTM Rails 6 - PullRequest
2 голосов
/ 07 октября 2019

У меня есть Модель пользователя и Модель разговора . У пользователя много разговоров, а в разговоре много пользователей, поэтому я использую отношения has_and_belongs_to_many через таблицу соединений :versations_users . Я использую метод для возврата диалога между конкретными пользователями (по идентификатору пользователя):

def find_conversation_between_users(ids)
  conversation = nil
  conversations = Conversation.all

  if conversations.present?
    conversations.each do |conv|
      next unless conv.user_ids == ids.sort

      conversation = conv
    end
  end
end


class Conversation < ApplicationRecord
  has_and_belongs_to_many :users
end

class User < ApplicationRecord
  has_and_belongs_to_many :conversations
end

Это работает, но не будет эффективно, если у нас будет тысячи разговоров, и это займет слишком много времени, чтобыперебрать каждый из них. Поэтому я пытаюсь создать область, которая возвращает конкретный диалог по связанным user_ids [1, 2, 3].

scope :by_user_id, ->(user_ids) { joins(:conversations_users).where([ conversations_users: { user_id: user_ids } ]) }

Но это не работает.

1 Ответ

0 голосов
/ 07 октября 2019

Попробуйте так:

class Conversation < ApplicationRecord
  has_and_belongs_to_many :users
  scope :by_user_id, ->(ids) { joins(:users).where(users: { id: ids }).group(:id).having("count(*) >= ?", ids.size) }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...