У меня есть таблица 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" = ?