我有以下关联:
Outlet => has_many :checkins
Checkin => belongs_to :outlet
每天,奥特莱斯需要获得1张签到。 今天我可以通过以下方式获取支票清单:
Checkin.where('DATE(created_at) = ?', Date.Today)
但是,我不确定如何获得今天没有与他们相关的签到的商店列表。
因此,如果 Outlet A 有今天创建的支票记录,但 Outlet B 没有办理登机手续,因此没有记录,则会退回出口B
如果我们这样说:
@checkin_outlet_name = Checkin.where('DATE(created_at) = ?', Date.Today).outlet.name
@outlet = Outlet.all
理论上我能够找到今天没有签到的所有奥特莱斯,因为 @outlet 而不是 @checkin_outlet_name 的所有记录都是那些我在找。
但是,我不知道如何在Rails中实现这一点。
非常感谢任何帮助。
答案 0 :(得分:0)
您可能需要Outlet.joins(:checkins).where("DATE(checkins.created_at) <> ?", Date.today)
答案 1 :(得分:0)
如果你想在不编写复杂查询的情况下这样做,
class Outlet
scope :checked_in_today, { joins(:checkins).where("DATE(checkins.created_at) = ?", Date.today) }
end
# remove items from Outlet.all which have been checked in today (Array - Array)
@not_checked_in_today = Outlet.all - Outlet.checked_in_today
在DB中更好的方法
class Outlet
scope :not_checked_in_today, lambda {
joins("LEFT OUTER JOIN (SELECT * FROM checkins WHERE created_at = #{Date.today.to_s(:db)}) c ON outltes.id = c.outlet_id"). #only select checkins created today
where("c.outlet_id IS NULL"). # only keep outlets not checked in today
select("DISTINCT outlets.*") # remove duplicates
}
end
@not_checked_in_today = Outlet.not_checked_in_today