【发布时间】:2009-06-10 22:58:45
【问题描述】:
这个问题把我难住了,所以我希望比我聪明的人能帮助我。
我正在做一个 Rails 项目,其中我有一个用户模型,它有一个关联的 clock_periods 加入它,具有以下部分定义:
User
has_many :clock_periods
#clock_periods has the following properties:
#clock_in_time:datetime
#clock_out_time:datetime
named_scope :clocked_in, :select => "users.*",
:joins => :clock_periods, :conditions => 'clock_periods.clock_out_time IS NULL'
def clocked_in?
#default scope on clock periods sorts by date
clock_periods.last.clock_out_time.nil?
end
检索所有打卡用户的 SQL 查询很简单:
SELECT users.* FROM users INNER JOIN clock_periods ON clock_periods.user_id = users.id
WHERE clock_periods.clock_out_time IS NULL
然而,反过来 - 找到所有当前被打卡的用户 - 看似困难。我最终使用了以下命名范围定义,尽管它很老套:
named_scope :clocked_out, lambda{{
:conditions => ["users.id not in (?)", clocked_in.map(&:id)+ [-1]]
}}
让我困扰的是,似乎应该有一种方法可以在 SQL 中做到这一点,而无需求助于生成像
这样的语句SELECT users.* FROM users WHERE users.id NOT IN (1,3,5)
有人有更好的方法吗,或者这真的是唯一的处理方法吗?
【问题讨论】:
标签: sql ruby-on-rails ruby