ruby-on-rails – Rails ActiveRecord :: StatementInvalid:PG :: Error:ERROR:missing FROM-clause entry for table

我有一个复杂的ActiveRecord查询,我正在建立不同的范围,具体取决于用户选择.我正在使用2颗宝石,这似乎在一起是有问题的,但我找不到谁是罪魁祸首:
Texticle(用于 Postgresql搜索)(2.0.3)
squeel(用于在Active Record查询中使用ruby语法)squeel(0.9.5)
Arel或Active记录自己

以下是我的类定义

class Event < ActiveRecord::Base
  belongs_to :entity,:class_name => "Entity",:foreign_key => :entity_id
  belongs_to :place,:foreign_key => :place_id

class Entity < ActiveRecord::Base
  has_many :events,:foreign_key => 'entity_id'
  has_many :events,:foreign_key => 'place_id'

最后,我的查询

Event.joins{entity.outer}.joins{place.outer}.includes(:place).includes(:entity).textsearch('anystring'.downcase)

*这是一个ActiveRecord :: Relation对象,在使用to_a调用它时会崩溃

这给我以下错误

ActiveRecord::StatementInvalid: PG::Error: ERROR:  missing FROM-clause entry for table "entities_events"
LINE 1: ... AS t1_r30,"entities"."metro_area_id" AS t1_r31,"entities_...
                                                             ^
: SELECT "events"."id" AS t0_r0,"events"."name" AS t0_r1,"events"."start_at" AS t0_r2,"events"."end_at" AS t0_r3,"events"."created_at" AS t0_r4,"events"."updated_at" AS t0_r5,"events"."entity_id" AS t0_r6,"events"."calendar_id" AS t0_r7,"events"."location" AS t0_r8,"events"."facebook_id" AS t0_r9,"events"."updated_time" AS t0_r10,"events"."privacy" AS t0_r11,"events"."venue_id" AS t0_r12,"events"."description" AS t0_r13,"events"."venue_city" AS t0_r14,"events"."venue_country" AS t0_r15,"events"."venue_state" AS t0_r16,"events"."venue_longitude" AS t0_r17,"events"."venue_latitude" AS t0_r18,"events"."yahoo_city" AS t0_r19,"events"."yahoo_country" AS t0_r20,"events"."yahoo_state" AS t0_r21,"events"."yahoo_updated_at" AS t0_r22,"events"."fb_updated_at" AS t0_r23,"events"."source_id" AS t0_r24,"events"."source_type" AS t0_r25,"events"."source_url" AS t0_r26,"events"."status" AS t0_r27,"events"."category" AS t0_r28,"events"."place_id" AS t0_r29,"events"."metro_area_id" AS t0_r30,"entities"."id" AS t1_r0,"entities"."image_url" AS t1_r1,"entities"."created_at" AS t1_r2,"entities"."updated_at" AS t1_r3,"entities"."name" AS t1_r4,"entities"."facebook_id" AS t1_r5,"entities"."link" AS t1_r6,"entities"."website" AS t1_r7,"entities"."company_overview" AS t1_r8,"entities"."mission" AS t1_r9,"entities"."category" AS t1_r10,"entities"."picture" AS t1_r11,"entities"."city" AS t1_r12,"entities"."zip" AS t1_r13,"entities"."country" AS t1_r14,"entities"."street" AS t1_r15,"entities"."state" AS t1_r16,"entities"."events_updated_at" AS t1_r17,"entities"."fblikes_updated_at" AS t1_r18,"entities"."fb_updated_at" AS t1_r19,"entities"."source_url" AS t1_r20,"entities"."source_type" AS t1_r21,"entities"."source_id" AS t1_r22,"entities"."place" AS t1_r23,"entities"."latitude" AS t1_r24,"entities"."longitude" AS t1_r25,"entities"."yahoo_city" AS t1_r26,"entities"."yahoo_state" AS t1_r27,"entities"."yahoo_country" AS t1_r28,"entities"."yahoo_updated_at" AS t1_r29,"entities"."fetched_elements_at" AS t1_r30,"entities_events"."id" AS t2_r0,"entities_events"."image_url" AS t2_r1,"entities_events"."created_at" AS t2_r2,"entities_events"."updated_at" AS t2_r3,"entities_events"."name" AS t2_r4,"entities_events"."facebook_id" AS t2_r5,"entities_events"."link" AS t2_r6,"entities_events"."website" AS t2_r7,"entities_events"."company_overview" AS t2_r8,"entities_events"."mission" AS t2_r9,"entities_events"."category" AS t2_r10,"entities_events"."picture" AS t2_r11,"entities_events"."city" AS t2_r12,"entities_events"."zip" AS t2_r13,"entities_events"."country" AS t2_r14,"entities_events"."street" AS t2_r15,"entities_events"."state" AS t2_r16,"entities_events"."events_updated_at" AS t2_r17,"entities_events"."fblikes_updated_at" AS t2_r18,"entities_events"."fb_updated_at" AS t2_r19,"entities_events"."source_url" AS t2_r20,"entities_events"."source_type" AS t2_r21,"entities_events"."source_id" AS t2_r22,"entities_events"."place" AS t2_r23,"entities_events"."latitude" AS t2_r24,"entities_events"."longitude" AS t2_r25,"entities_events"."yahoo_city" AS t2_r26,"entities_events"."yahoo_state" AS t2_r27,"entities_events"."yahoo_country" AS t2_r28,"entities_events"."yahoo_updated_at" AS t2_r29,"entities_events"."fetched_elements_at" AS t2_r30,"entities_events"."metro_area_id" AS t2_r31 FROM "events" LEFT OUTER JOIN "entities" ON "entities"."id" = "events"."entity_id" LEFT OUTER JOIN "entities" "places_events" ON "places_events"."id" = "events"."place_id" WHERE (to_tsvector('english',"events"."name"::text) @@ to_tsquery('english','canadiens'::text))  ORDER BY "rank0.11630770538778923" DESC
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1106:in `async_exec'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1106:in `exec_no_cache'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:650:in `block in exec_query'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.2.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:649:in `exec_query'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1201:in `select'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:16:in `select_all'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:211:in `find_with_associations'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/relation.rb:170:in `exec_queries'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/relation.rb:159:in `block in to_a'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/explain.rb:40:in `logging_query_plan'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/relation.rb:158:in `to_a'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/relation.rb:495:in `inspect'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start'
     from /Users/guillaumenm/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top (required)>'
     from ./script/rails:6:in `require'

If I call the to_sql method on the query,I get a working sql statement like this :
 => "SELECT \"events\".*,ts_rank(to_tsvector('english',\"events\".\"name\"::text),to_tsquery('english','canadiens'::text)) AS \"rank0.7148935848557265\" FROM \"events\" LEFT OUTER JOIN \"entities\" ON \"entities\".\"id\" = \"events\".\"entity_id\" WHERE (to_tsvector('english',\"events\".\"name\"::text) @@ to_tsquery('english','canadiens'::text)) AND ((\"events\".\"start_at\" >= '2012-02-19T00:00:00+00:00' AND \"events\".\"start_at\" <= '2012-02-25T23:59:59+00:00')) ORDER BY \"rank0.7148935848557265\" DESC"

> Active Record和ARel是否完全负责执行完整的sql语句?
为什么to_sql不会产生相同的结果?
>任何方式强制(不给出完整的OUTER JOIN语法)连接名称
>我如何确保捕获有问题的部分填写适当的错误报告?我在调试器中很迷失,试图找出哪些代码写入不正确的连接语句||或具有无效联接关联名称的不正确的SELECT子句.

谢谢

解决方法

我刚刚遇到了同样的错误,我用这一行代码
SampleItem.joins(:campaign_market).where(campaign_market: {market_id: current_admin_user.market_id})

我的原因比上面简单得多,但是连接(:campaign_market)是正确的,因为它是一个belongs_to /父记录,但是:

.where(campaign_market: {market_id: current_admin_user.market_id})

本来应该:

.where(campaign_markets: {market_id: current_admin_user.market_id})

.where()子句总是想要复数表名,而不是关联名.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...