2017-02-28 78 views
0

我有一個在Rails查詢有點麻煩。Rails查詢條件計數

其實我的問題是:

我想選擇所有users不具有任何user_plansrole.name是等於默認... OR user_plans所有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 )。其中COUNT((user_plans.expire_date

+0

只需使用'joins'?!? – Fallenhero

+0

@Jyotimishra我想知道這個查詢的確切語法,但是謝謝 – DR7

回答

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

的東西應該工作,沒有測試,但應該給你一些想法,你可以使用(調用.distinct玩在最後可能是必要的)

還有哪裏OR in Rails 5:

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

FYI:調用上的用戶.joins只取那些誰擁有至少一個user_plan(換句話說:不會獲取那些誰沒有計劃)的用戶

+0

其實在這個查詢中,如果一個'user'有多個'user_plans',並且這個計劃之一有'user_plans.expire_date'>今天他會也會顯示。 我只想要在'user_plans'的所有記錄中只有'user_plans.expired_date' DR7