Rails查询条件为count

时间:2017-02-28 04:55:05

标签: ruby-on-rails postgresql activerecord

我在Rails中查询时遇到了一些麻烦。

其实我的问题是:

  

我想选择所有users没有任何user_plans AND 他的role.name等于默认的所有user_plans。 。user_plans.expire_date且所有user都低于今天

roles has_many user

user_plans has_many 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

这里的代码,正是我所需要的,但有多个查询。 我不知道如何在一个查询中构建它。

  

我想知道是否有可能做类似

的事情      

{{1}}

1 个答案:

答案 0 :(得分:0)

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

应该工作,不测试,但应该给你一些你可以玩的想法(最后可能需要调用.distinct

Rails 5中还有OR:

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

仅供参考:在用户上调用.joins只会获取至少有一个user_plan的用户(换句话说:不会获取没有计划的用户)