2012-02-23 25 views
9

के लिए FROM-खंड प्रविष्टि गुम मैं एक जटिल ActiveRecord क्वेरी है कि मैं अलग-अलग दायरों के साथ निर्माण कर रहा हूँ, उपयोगकर्ता चयन के आधार पर किया है। मैं जो एक साथ कई समस्याएं खड़ी कर रहा है 2 जवाहरात, उपयोग कर रहा हूँ, लेकिन मैं जो बीच दोषी है नहीं मिल सकता है: Texticle (के लिए Postgresql पूर्ण खोज) (2.0.3) Squeel (सक्रिय रिकॉर्ड क्वेरी में गहरे लाल रंग का वाक्य रचना उपयोग के लिए) squeel (0.9.5) अरेल या सक्रिय रिकॉर्ड खुद कोरेल ActiveRecord :: StatementInvalid: पीजी :: त्रुटि: त्रुटि: तालिका

यहाँ मेरी कक्षाओं परिभाषाएं दी गई हैं:

class Event < ActiveRecord::Base 
    belongs_to :entity, :class_name => "Entity", :foreign_key => :entity_id 
    belongs_to :place, :class_name => "Entity", :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 :: रिलेशन वस्तु है, कौन सी सीआर राख जब 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"."metro_area_id" AS t1_r31, "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" 
  • सक्रिय रिकॉर्ड और अरेल पूरी तरह से पूर्ण एसक्यूएल बयान को लागू करने के लिए जिम्मेदार है?
  • क्यों to_sql एक ही परिणाम उत्पन्न नहीं करता है?
  • किसी भी तरह से बल देने के लिए (पूर्ण बाहरी जॉइन वाक्यविन्यास दिए बिना) नाम शामिल है?

  • मैं कैसे उचित बग रिपोर्ट में भरने के लिए समस्या पैदा करने वाले टुकड़ा कब्जा करने के लिए यकीन है कि हो सकता है? मैं अपने डीबगर में बहुत खो गया हूं यह जानने का प्रयास कर रहा हूं कि कोड का कौन सा टुकड़ा ग़लत जॉइन स्टेटमेंट लिखता है || या अमान्य जॉइन एसोसिएशन नाम के साथ गलत चयन खंड।

धन्यवाद

उत्तर

5

ज्यादा डिबगिंग के बाद, मैं इस मुद्दे को मिला :-(गुणकों किया जाना है।

पहले, मिलती आदेश से मेल खाना चाहिए शामिल आदेश। इसलिए, 2 लाइनों, नहीं करता है ' टी एक ही SQL क्वेरी का उत्पादन। नामकरण उपनाम अलग हैं। मेरा मानना ​​है कि यह एक सक्रिय रिकॉर्ड \ अरेल मुद्दा यह है कि मैं हूँ झंडा।

Event.joins{entity.outer}.joins{place.outer}.includes(:place).includes(:entity) 

से अलग है है
Event.joins{entity.outer}.joins{place.outer}.includes(:entity).includes(:place) 

हालांकि, यह समस्या पारदर्शी थी, जब तक कि मैंने अपनी टेक्स्ट खोज के लिए एक और गुंजाइश नहीं जोड़ा। मेरा अनुमान है क्योंकि SQL कॉलम प्रत्येक कॉलम के लिए कॉलम उपनाम जोड़ने के लिए बदल गया है। उपनामों ने टेबल उपनाम का भी उपयोग किया, जो तब से FROM और जॉइन क्लॉज में से एक से अलग था।

ऑर्डर बदलने से, मेरी सभी समस्याओं को ठीक नहीं किया गया। मैंने एक और मुद्दा खोजना शुरू कर दिया जहां मेरी पाठ्यचर्या का पूर्ण खंड डीबी में जाने वाली क्वेरी से फिसल गया। इसके बजाय, मैं इस त्रुटि मिलती है:

ActiveRecord::StatementInvalid: PG::Error: ERROR: column "rank0.8601929506100121" does not exist 
LINE 1: ...o_tsquery('english', 'canadiens'::text)) ORDER BY "rank0.860... 

मैं भी मानते हैं कि यह या तो एक texticle, squeel या ActiveRecord/अरेल बग, यकीन नहीं होने के लिए जो एक अभी तक ...

तो दर्दनाक मैं लिखना चाहते हैं हाथ से अपने स्वयं के एसक्यूएल कथन फिर से ...

+0

यह बदसूरत बदसूरत है। मैं इसी तरह के मुद्दों पर मार रहा हूँ। – jevy

+1

मैंने जो किया वह हिस्सा शामिल है। यह वह टुकड़ा है जो कस्टम चयन विवरणों को फेंकता है। मैं स्क्वायर प्लगइन के माध्यम से बाएं बाहरी जुड़ने का उपयोग कर समाप्त हुआ, और मेरे "शामिल" वर्गों के लिए मैन्युअल रूप से मेरे चयन कथन लिख रहा हूं। अंत में, मैं प्रदर्शन के लिए चयन सीमित करना चाहता था, इसलिए मुझे लगता है, मैं उस बिंदु पर हूं जहां मैं बनना चाहता था। तो बग, अंत में, ActiveRecord :: शामिल है, और परोक्ष रूप से, टेक्स्टिकल अनुमति एआर संबंध वस्तु में शामिल है। – xlash

+0

हम एक नामित गुंजाइश का उपयोग कर रहे थे जो कि "जहां" विधि का उपयोग कर रहा था। हमने पुराने स्कूल "परिस्थितियों" तरीके का उपयोग करने के लिए इसे बदल दिया और यह ठीक काम किया। ऐसा लगता है कि किसी भी तरह की विधि बग। – jevy

16

मैं सिर्फ एक ही त्रुटि कोड की इस पंक्ति के साथ मेरे लिए आते हैं, मिला है:

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

मेरे कारण था ऊपर एक की तुलना में कहीं अधिक सरल, joins(: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() खंड हमेशा बहुलित तालिका का नाम चाहता है, न कि एसोसिएशन नाम।

संबंधित मुद्दे