2016-10-12 1 views
1

이는 SQL 질문 더를 가지고있는 기록을 찾아,하지만 난 레일에서이 문제를 해결하려고 : ALL 협회가 특정 값

은 내가 User 사람 has_many :days 있습니다. 일수는 status이며 이 가능합니다. 또는 이 예약되었습니다.입니다. 의 모든 사용자에게 사용 가능한 날짜는입니다. 내가 사용

User.includes(:days).where.not(days: { status: 'booked' }).references(:days) 

생성 된 SQL 쿼리는 다음과 같습니다

SELECT * FROM "users" LEFT OUTER JOIN "days" ON "days"."user_id" = "users"."id" WHERE ("days"."status" != 'booked') 

결과 상태의 두 종류가 사용자가 포함되어 있습니다. 이 문제를 해결하는 방법에 대해 감사드립니다.

+1

레일에서 작업을 수행하는 방법을 모르고 있지만, 쿼리가 더 이렇게 될 필요가있다 : 레일 구문은 다음과 같습니다 NOT IN ID (일 WHERE 구별 USER_ID를 선택 WHERE'사용자 SELECT * FROM status = '예약 됨') ' – CptMisery

+0

'이용 가능일 만있는 사람 '은 무엇을 의미합니까? 특정 날짜 (또는 일) 동안 사용 가능한 사용자 또는 예약 된 날짜가없는 사용자를 원하십니까? – max

+0

@max 나는 모든 요일에 사용할 수있는 사용자를 찾으려고합니다. 나는 이것을'''.where (날짜 : from..too)''범위로 결합 할 것입니다. – Railsana

답변

0

@CptMisery가 올바르게 대답했습니다.

User.where.not(id: Day.select(:user_id).distinct.where(status: 'booked'))

2

사용 가능한 날짜 만있는 모든 사용자를 찾고 싶습니다. 생성 된 SQL이 같은 모양

User.joins(:days).where(days: { status: 'available' }).group('users.id') 

: 당신이 joins를 사용해야 사물의 유형에 대해

내가 당신을 오해하는 경우

SELECT users.* FROM users INNER JOIN days ON days.user_id = users.id WHERE days.status = available 

편집

을하고, 상태가 "booked" 또는 "available"이 아닌 경우 (예 : bla 당신이 where.not로했다으로) NK 또는 nil, 다음 쿼리는 다음과 같아야합니다

User.joins(:days).where.not(days: { status: 'booked' }).group('users.id') 

EDIT2

가능한 일와 예약 사람이없는 사용자를 얻기 위해 나는 아마 할 것 :

User.joins(:days).where.not(days: { status: 'booked' }).where(days: { status: 'available' }).group('users.id') 
+0

'User.joins (: days) .where.not (days : {status : 'booked'})' – max

+0

@max는 질문에서 (어떻게 든) '상태'는 '예약'또는 '사용 가능'이라고 결론 지었다. 하지만 당신 말이 맞습니다. 우리는 대답하는 동안 정확해야합니다. –

+1

'예약'되지 않은 * 적어도 하루가있는 사용자는 반환하지 않습니까? 원래 질문은 "유일한 * 사용 가능일을 가진 모든 사용자"를 찾는 방법을 묻습니다. – gmcnaughton