Ruby on Rails找到没有记录的地方

时间:2011-08-13 16:21:21

标签: ruby-on-rails-3 analytics

我有以下关联:

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中实现这一点。

非常感谢任何帮助。

2 个答案:

答案 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