Ruby on Rails находит там, где нет записи - PullRequest
0 голосов
/ 13 августа 2011

У меня есть следующие ассоциации:

Outlet => has_many :checkins
Checkin => belongs_to :outlet

Каждый день, и аутлет должен пройти 1 регистрацию. Я могу получить список торговых точек с проверкой, сделанной сегодня, с этим:

Checkin.where('DATE(created_at) = ?', Date.Today)

Однако я не уверен, каким образом я мог получить список торговых точек, с которыми сегодня не была связана регистрация.

Таким образом, если бы на выходе A была создана запись о регистрации, созданная сегодня, но на выходе B не было зарегистрировано и, следовательно, не было выполнено ни одной записи, выход B был бы возвращен.

Если мы скажем, что:

@checkin_outlet_name = Checkin.where('DATE(created_at) = ?', Date.Today).outlet.name

@outlet = Outlet.all

Теоретически я смог бы найти все аутлеты без проверок, сделанных сегодня, потому что все записи, которые находятся в @ outlet , а НЕ в @ checkin_outlet_name , будут теми, кем я являюсь ищу.

Однако я не знаю, как этого добиться в Rails.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 14 августа 2011

Если вы хотите сделать это без написания сложных запросов,

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

Лучший способ сделать это в БД

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
0 голосов
/ 13 августа 2011

Вы, вероятно, хотите что-то вроде Outlet.joins(:checkins).where("DATE(checkins.created_at) <> ?", Date.today)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...