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

时间:2015-02-16 10:42:03

标签: ruby ruby-on-rails-3

我在Rail 3.2 ruby​​ 2.1.5应用程序中有2个模型,即User和Absence,

class User
  has_many :absences
end

class Absence
  belongs_to :user
end

缺席时有:start_date和:end_date

我需要以最有效的方式弄清楚以下内容

"今天有多少用户缺席?"

因此,这将是所有缺席的选择中的不同用户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

那&#34;思考&#34;这让我得到了我需要的ID,但这是进行此查询的最有效方法吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

我认为你应该使用:

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