Rails 4加入查询显示错误的资源

时间:2014-10-08 14:38:59

标签: ruby-on-rails rails-activerecord

我有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位医生......

有人知道我的查询有什么问题吗?

谢谢,

2 个答案:

答案 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])

这应该是可以优化使用索引并运行得非常快。