StatementInvalid Rails查询

时间:2018-05-31 16:50:06

标签: ruby-on-rails ruby ruby-on-rails-5

我有以下有效的查询:

jobs = current_location.jobs.includes(:customer).all.where(complete: complete)

但是,当我添加一个where子句来查询customer表的第一个名字时,我收到一个错误。

jobs = current_location.jobs.includes(:customer).all.where(complete: complete).where("customers.fist_name = ?", "Bob")

这是错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "customers"
LINE 1: ...bs"."complete" = $2 AND "jobs"."status" = $3 AND (customers....
                                                         ^
: SELECT  "jobs".* FROM "jobs" INNER JOIN "jobs_users" ON "jobs"."id" = "jobs_users"."job_id" WHERE "jobs_users"."user_id" = $1 AND "jobs"."complete" = $2 AND "jobs"."status" = $3 AND (customers.last_name = 'Bob') ORDER BY "jobs"."start" DESC LIMIT $4 OFFSET $5

current_location方法:

def current_location
    return current_user.locations.find_by(id: cookies[:current_location])
end

位置模型

has_many :jobs
has_and_belongs_to_many :customers

工作模式

belongs_to :location
belongs_to :customer

客户模式

has_many :jobs
has_and_belongs_to_many :locations

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

如果您设置了对该关联的引用,

includes将仅加入该表。

使用includes时,请确保以两种方式引用该关联:

  • 您可以使用references方法加入表格,无论是否有任何查询条件(如果您必须使用原始SQL,如您的问题所示,那么这是您需要的方法使用)例如

    current_location.jobs
      .includes(:customer)
      .references(:customer)
    
  • 或者您可以使用where的哈希查找器版本:(请注意,在where子句中使用关联引用时,您必须引用表名,在本例中为customers并且不是关联名称customer

    current_location.jobs
      .includes(:customer)
      .where(customers: {first_name: "Bob" }) 
    

这两个都会急切加载customer引用的jobs

第一个选项(references)将OUTER JOIN customers表,以便只要没有查询条件引用customers表,即使没有客户也会加载所有作业。

第二个选项(使用where)将OUTER JOIN customers表,但是对customers表提供查询参数,它将非常像INNER JOIN。

如果您只需要根据jobs信息搜索customer,那么joins是更好的选择,因为这会创建一个与客户表的INNER JOIN,但不会尝试加载查询中的任何客户数据,例如

current_location.jobs.joins(:customer).where(customers: {first_name: "Bob" }) 
无论查询中的引用如何,

joins都将始终包含关联的表。

旁注:您的查询中的all完全没必要

答案 1 :(得分:1)

includes(:customer)不一定将customers表连接到SQL查询中。您需要使用joins(:customer)强制Rails将customers表加入SQL查询,并使其可用于查询条件。

jobs = current_location.jobs
                       .joins(:customer)
                       .includes(:customer)
                       .where(complete: complete)
                       .where(customers: { first_name: 'Bob' })