rails 中跨表/模型查询的最有效方式

most efficient way to query across tables / models in rails

我在 Rail 3.2 ruby 2.1.5 app

中有 2 个模型,分别是 User 和 Absence
class User
  has_many :absences
end

class Absence
  belongs_to :user
end

在 Absence 上有一个 :start_date 和一个 :end_date

我需要以最有效的方式解决以下问题

"how many users are absent today?"

因此,这将是从开始日期为今天或今天之前以及结束日期为今天或今天之后的所有缺席中选择的不同用户 ID 的计数。

我考虑过做类似

的事情
user_ids =  Absence.where("absences.start_date <= ? and absences.end_date >= ?", Date.today, Date.today).map(&:user_id)
user_ids.uniq!
user_ids.count

"think" 可以计算出我需要的 ID,但这是执行此查询的最有效方法吗?

试试这个:

absent_users = User.includes(:absences).where("absences.start_date <= ? and absences.end_date >= ?", Date.today, Date.today)

或者更简洁:

current_date = Date.today
absent_users = User.includes(:absences).where("absences.start_date <= ? and absences.end_date >= ?", current_date, current_date)

它应该让你得到不同的用户结果,如果你仍然没有得到不同的结果然后在活动记录链中添加 distinct

您是否只追求独特的 user_id 记录?那么您只需在 user_id 列的查询中添加 select

absent_user_ids = Absence.select(:user_id).where("absences.start_date <= ? and absences.end_date >= ?", Date.today, Date.today).distinct

我认为你应该使用:

Absence.where("absences.start_date <= ? and absences.end_date >= ?", Date.today, Date.today).group("user_id").length