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
我在 Rail 3.2 ruby 2.1.5 app
中有 2 个模型,分别是 User 和 Absenceclass 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