2017-02-28 10 views
0

Railsでのクエリに少し問題があります。数が条件付きのRailsクエリ

は私がuser_plansが彼のrole.nameあるいずれかがデフォルト ... ORuser_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 

ここまでこのコードは、しかし、複数のクエリと、私は必要なものを正確にやっています。 これを1つのクエリで構築する方法はわかりません。

私はないテストし、動作するはず

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

+0

User.where(gym_id:current_user.id:のみ(予定はありません人をフェッチしません、他の言葉で)少なくとも一つのuser_planを持つユーザーをフェッチするユーザーに.joinsを呼び出します).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:

+0

実際にこのクエリでは、 'user'に複数の' user_plans'があり、このプランの1つに 'user_plans.expire_date'>があります同様に表示されます。 私は 'user_plans.expired_date'をのすべてのレコードにのみ、または' user_plans'を使用しないようにしたいと思っています... しかし、感謝します:) – DR7