Запрос Rails, где хотя бы 1 из связанных записей содержит атрибут - PullRequest
0 голосов
/ 18 января 2019

У меня есть таблица GroupMeetings и таблица GroupMeetingsUser, которая является таблицей соединения между User и GroupMeetings. Я хочу найти все GroupMeetings, где хотя бы один из GroupMeetingsUser имеет атрибут.

Прямо сейчас это работает:

   @group_meetings = GroupMeeting.where('lang_one_id IN (?) AND lang_two_id IN (?) AND meeting_time >= ?', @user.languages.pluck(:id), @user.languages.pluck(:id), Date.today)

   @new_group_meetings_id = []

   @group_meetings.each do |meeting|
     meeting.group_meetings_user.each do |user|
       if(user.user.location === @user.location)
         @new_group_meetings_id.push(meeting.id)
       end
     end
   end

   @group_meetings = GroupMeeting.where('id IN (?)', @new_group_meetings_id)

Но как вместо этого включить в исходный запрос GroupMeetings цикл .each? Например, используя .joins(:group_meetings_user), чтобы найти все записи, где хотя бы у одного пользователя есть атрибут?

class GroupMeeting < ApplicationRecord
    has_many :group_meetings_users
    has_many :users, through: :group_meetings_users
end

class GroupMeetingsUser < ApplicationRecord
    belongs_to :user
    belongs_to :group_meeting

    validates_presence_of :user_id, :group_meeting_id
    validates :user_id, :uniqueness => {:scope => :group_meeting_id, :message => 'can only join each group once.'}
end

ОБНОВЛЕНИЕ 1:

GroupMeeting.joins(:users).where(group_meeting: { lang_one_id: @user.languages.pluck(:id), lang_two_id: @user.languages.pluck(:id), meeting_time: DateTime.now..DateTime::Infinity.new}, user: { location: @user.location })

выдает ошибку:

no such column: group_meeting.lang_one_id: SELECT "group_meetings".* FROM "group_meetings" INNER JOIN "group_meetings_users" ON "group_meetings_users"."group_meeting_id" = "group_meetings"."id" INNER JOIN "users" ON "users"."id" = "group_meetings_users"."user_id" WHERE "group_meeting"."lang_one_id" IN (29, 30, 31, 22) AND "group_meeting"."lang_two_id" IN (29, 30, 31, 22) AND ("group_meeting"."meeting_time" >= ?) AND "user"."location" = ?

1 Ответ

0 голосов
/ 18 января 2019

Я предлагаю следующее:

GroupMeeting
  .joins('INNER JOIN languages l1 ON languages l1.id = group_meetings.lang_one_id')
  .joins('INNER JOIN languages l2 ON languages l2.id = group_meetings.lang_two_id')
  .joins(:group_meeting_users => :users)
  .where('meeting_time >= ?', Date.today)
  .select('group_meetings.*')
  .group('group_meetings.id')
  .having('users.location = ?', @user.location)

Это должно быть быстрее, чем делать подвыборы (используя languages.id IN (?) и pluck)

Дайте мне знать, если это работает и / или если у вас есть вопросы.

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