列出用户和关联可选(如果他们有当天的记录)
问题描述:
我有一个用户模型和另一个模型,告诉我他们“签入”工作的时间。列出用户和关联可选(如果他们有当天的记录)
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'
用户可能有也可能没有当天的签入,如果他们这样做,签入协会应该是非零,否则为零。
如何使用活动记录执行此查询?
答
这不完全是你问的,但你可以完成类似的范围关联。添加到您的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关联。
你在SO上的声誉令人惊叹,它告诉我们你只能回答这样的问题。为什么?????它非常基础。为了名字的缘故? – krishnar
[LEFT OUTER JOIN in Rails 4]的可能重复(https://*.com/questions/24358805/left-outer-join-in-rails-4) – krishnar