2017-02-28 1 views
0

레일스에서 ​​쿼리에 약간 문제가 있습니다.수에 조건이있는 레일스 쿼리

내가 user_plans 그의 role.name 어떤이 기본 ... 또는user_plans을 가지고 같음이없는 모든 users을 선택합니다 모든 user_plans.expire_date은 다음과 같습니다

사실 내 문제입니다 오늘

user has_many roles

user has_many user_plans

users = User.where(gym_id: current_user.id).order(:id) 
@users = [] 
for u in users 
    if u.roles.pluck(:name).include?('default') 
    add = true 
    for up in u.user_plans 
     if up.end_date > DateTime.now.to_date 
     add = false 
     end 
    end 
    if add 
     @users << u 
    end 
    end 
end 

여기까지이 코드는하지만, 여러 쿼리와, 내가 필요 정확히하고있다. 하나의 쿼리로이 방법을 작성하는 방법을 모르겠습니다.

나는 그렇지 테스트 작업을해야

where COUNT(user_plans.expire_date < TODAY) == 0

+0

User.where (gym_id : current_user.id : 전용 (계획이없는 사람들을 가져 오지 않습니다 즉) 적어도 하나의 user_plan가 해당 사용자를 가져옵니다 사용자에 .joins를 호출) .where COUNT ((user_plans.expire_date

+0

그냥'join '을 사용 하시겠습니까? – Fallenhero

+0

@Jyotimishra이 쿼리에 대한 정확한 구문을 알고 싶지만 – DR7

답변

0
User.joins(:user_plans, :roles).where("roles.name = 'default' OR user_plans.expire_date < ?", Date.today) 

같은 것을 할 수있는 경우 궁금하지만, 당신이 (이 .distinct를 호출 놀 수있는 몇 가지 아이디어를 줄 것이다 끝 부분에 필요할 수도 있음)

또한 레일 5의 OR 위치는 다음과 같습니다.

User.joins(:user_plans, :roles).where(roles: { name: 'default' }).or(
    User.joins(:user_plans).where('user_plans.expire_date < ?', Date.today) 
) 

참고 :

+0

실제로이 쿼리에서'user'가 하나 이상의'user_plans'을 갖고이 계획 중 하나가'user_plans.expire_date'> 오늘 뿐만 아니라 표시됩니다. 나는 단지'user_plans.expired_date'를 가진 사용자가'user_plans'의 모든 기록에서, 아니면'user_plans'에서 ...를 원하지 않습니다 ... 하지만 고마워요 :) – DR7