1

私はworkordersとemployeesテーブルを持っています。各ワークオーダーには、割り当てられた従業員とスーパーバイザーが割り当てられています。

workorder.rb には次のものがあります。

belongs_to :super, :class_name => "Employee", :foreign_key => "super_id"
belongs_to :employee

結合を含む where 句を作成しようとしています。への参加には問題なく機能し:clientます。しかし、:superうまくいきません。

これは私の現在の試みです:

workorders = workorders.joins(:client,:super).where("wonum like :search or description like :search or clients.client_name like :search or super.employee_full_name like :search ", search: "%#{params[:sSearch]}%")

私は戻ってきます:

SELECT COUNT(*) FROM "workorders" INNER JOIN "clients" ON "clients"."id" = "workorders"."client_id" INNER JOIN "employees" ON "employees"."id" = "workorders"."super_id" WHERE (wonum like '%CHUCK%' or description like '%CHUCK%' or clients.client_name like '%CHUCK%' or super.employee_full_name like '%CHUCK%' ) AND (wostatus_id NOT IN (231,230,9263,9264,232))
Completed 500 Internal Server Error in 236ms
ActiveRecord::StatementInvalid - PG::Error: ERROR:  missing FROM-clause entry for table "super"

助けてくれてありがとう!

4

1 に答える 1

2

employeesテーブルは としてエイリアス化されてsuperおらず、この場合は 1 回だけ結合されるため、エイリアス化する必要はまったくありません。

workorders = workorders.joins(:client,:super).
               where("wonum like :search or description like :search or clients.client_name like :search or employees.employee_full_name like :search ", 
               search: "%#{params[:sSearch]}%")

そして、あなた(およびこれを読んでいる人)の正気のために、このロジックをスコープに移動してください:

scope :search, lambda{ |term|
  %w(wonum description clients.client_name employees.employee_full_name).
    map{|field| "#{field} like :search" }.
    join(" or "), search: term
}

workorders = workorders.joins(:client, :super).search("%#{params[:sSearch]}%")
于 2013-05-13T15:09:37.773 に答える