2017-10-21 20 views
1

我有一個用戶模型和另一個模型,告訴我他們「簽入」工作的時間。列出用戶和關聯可選(如果他們有當天的記錄)

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://stackoverflow.com/questions/24358805/left-outer-join-in-rails-4) – krishnar

回答

0

這不完全是你問的,但你可以完成類似的範圍關聯。添加到您的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關聯。

相關問題