列出用户和关联可选(如果他们有当天的记录)

问题描述:

我有一个用户模型和另一个模型,告诉我他们“签入”工作的时间。列出用户和关联可选(如果他们有当天的记录)

User 
- id 
- name 

Checkins 
- user_id 
- timestamps 

所以在我的用户模型,我有这样的:

class User < ApplicationRecord 
    has_many :checkins 
end 

我想要做的就是在页面上显示的用户的列表,如果他们有当天的检入,则'checkin'association应该存在,否则为空。

@users = User.find_todays_checkin() 

所以我必须基本上执行一个外部连接我猜?

select * 
from users u 
    outer join checkins c on u.id = c.user_id 
where c.created_at = '2017-10-21' 

用户可能有也可能没有当天的签入,如果他们这样做,签入协会应该是非零,否则为零。

如何使用活动记录执行此查询?

+1

你在SO上的声誉令人惊叹,它告诉我们你只能回答这样的问题。为什么?????它非常基础。为了名字的缘故? – krishnar

+0

[LEFT OUTER JOIN in Rails 4]的可能重复(https://*.com/questions/24358805/left-outer-join-in-rails-4) – krishnar

这不完全是你问的,但你可以完成类似的范围关联。添加到您的User型号:

has_many :todays_checkins, class_name: 'Checkin', 
    -> { where(created_at: Time.now.beginning_of_day..Time.now.end_of_day) } 

上的用户记录呼叫todays_checkins将返回相关的签到当天。例如:

User.first.todays_checkins # User's checkins for today or nil 

你可以通过所有用户和输出今天的签入迭代如下:

@users = User.all.includes(:checkins) 
@users.each { |user| puts user.todays_checkins } 

UPDATE

如果你希望能够动态地做到这一点,你可以更改checkins通过为您添加分级方法即时关联User型号:

def self.find_todays_checkins 
    User.has_many :checkins, 
    -> { where created_at: Time.now.beginning_of_day..Time.now.end_of_day } 
end 

现在,运行User.find_todays_checkins将修改您的checkins关联以仅显示今天的签入。你将不得不写一个类似的关联将其恢复到原来的范围。当然,这会影响整个User类。我不确定如何将其本地化为一个ActiveRecord关联。