我有以下有效的查询:
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
如何解决此问题?
答案 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' })