我有2个资源,医生和保留。
class Doctor < ActiveRecord::Base
has_many :reservations
end
class Reservation < ActiveRecord::Base
belongs_to :doctor
end
架构:
create_table "reservations", force: true do |t|
t.integer "doctor_id"
t.date "date"
end
create_table "doctors", force: true do |t|
t.string "description"
t.datetime "created_at"
t.datetime "updated_at"
end
我希望在约会时显示所有可用的医生,所以当天所有医生都没有任何预约。
我的查询:
def index
@doctors = Doctor.all.order("created_at DESC")
@doctors = @doctors.joins(:reservations).where.not('reservations.date LIKE ?',params[:free_on]) if params[:free_on].present?
@doctors = @doctors.paginate(:page => params[:page], :per_page => 9)
end
我的问题是: 那个查询给了我保留的结果。 如果我在我的数据库中有1位医生和3位预约,并且我选择了11月1日(该日期的1次预约),那么对于2月1日没有的2次预约,它会显示相同医生的2倍。 / p>
我试过.group,但是如果有预约的话,它再次显示我只有1位医生......
有人知道我的查询有什么问题吗?
谢谢,
答案 0 :(得分:0)
您是否尝试过uniq
?
@doctors = @doctors.joins(:reservations).where.not('reservations.date LIKE ?',params[:free_on]).uniq
作为旁注,我会关注使用.date LIKE ?
来实现这样的功能。
答案 1 :(得分:0)
查询的整个前提是错误的。
@doctors = @doctors.joins(:reservations).where.not('reservations.date LIKE ?',params[:free_on])
您发现医生在“free_on”以外的日子有预约 - 无论他们是否对“free_on”进行预约。这不是你想要做的。你想找到对“free_on”没有保留意见的医生。
@doctors = @doctors.where("not exists (select * from reservations where doctor_id=doctors.id and reservations.date=?)", params[:free_on])
这应该是可以优化使用索引并运行得非常快。