我在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}}
答案 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的用户(换句话说:不会获取没有计划的用户)