2012-01-09 5 views
19

त्रुटि को ठीक करने में थोड़ी सी परेशानी हो रही है।रेल 3.1। Heroku PGError: ऑपरेटर मौजूद नहीं है: वर्ण भिन्न = पूर्णांक

सभी स्थानीय मशीन पर बहुत अच्छा काम करता है। पीजी पर, उसकाोकू त्रुटि है।

यहाँ लॉग हैं:

←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m ActionView::Template::Error (PGEr 
    ror: ERROR: operator does not exist: character varying = integer 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m LINE 1: ...T "reviews".* FROM "re 
    views" WHERE "reviews"."trip_id" = 32 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m : SELECT "reviews".* FROM "review 
    s" WHERE "reviews"."trip_id" = 32): 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  31: <div style='display:non 
    e'> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  33:  <% for review in @tr 
    ip.reviews %> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  34: 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  32: <div id="inline"> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m HINT: No operator matches the gi 
    ven name and argument type(s). You might need to add explicit type casts. 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m app/controllers/trips_controlle 
    r.rb:21:in `show' 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m cache: [GET /trips/32] miss 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  36:  <li> <%= review.conte 
    nt %> </li> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  35:  <ul> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m app/views/trips/show.html.erb:3 
    3:in `_app_views_trips_show_html_erb__3301405670044045300_69859019468960' 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Completed 500 Internal Server Err 
    or in 86ms 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Parameters: {"id"=>"32"} 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Processing by TripsController#s 
    how as HTML 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Rendered trips/show.html.erb with 
    in layouts/application (81.8ms) 

वास्तव में सुनिश्चित नहीं हैं कि वास्तव में, त्रुटि होती है और यह कैसे तय करने के लिए जहां।

reviews.rb

class Review < ActiveRecord::Base 
    belongs_to :trip 
end 

class Trip < ActiveRecord::Base 
    has_many :reviews, :dependent => :destroy 
    attr_accessible, :reviews_attributes 

    accepts_nested_attributes_for :reviews, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true 
end 

show.html.rb

<%= link_to "Read Reviews", '#inline', :id => 'various1', :class => 'review' %> 

<div style='display:none'> 
    <div id="inline"> 
     <% for review in @trip.reviews %> 
     <ul> 
     <li> <%= review.content %> </li> 
     <li> <i> <%= review.name %> </i> </li> 
     </ul> 
    <% end %> 
    </div> 
</div> 

बात यह है कि confuses मुझे लगता है कि मैं दो अन्य व्यावहारिक रूप से एक ही मॉडल है, लेकिन वे अच्छी तरह से काम करता है।

धन्यवाद!

उत्तर

32

आपकी समस्या यहाँ है:

WHERE "reviews"."trip_id" = 32 

और त्रुटि संदेश का कहना है कि:

operator does not exist: character varying = integer

ताकि आप अपने trip_id स्तंभ reviews में स्ट्रिंग के रूप के बजाय एक पूर्णांक के रूप में बनाया है। यह SQLite में ठीक काम करेगा क्योंकि SQLite का प्रकार सिस्टम ढीला है लेकिन यह PostgreSQL में काम नहीं करेगा क्योंकि PostgreSQL काफी कठोर है।

आप एक प्रवास जोड़ने trip_id के प्रकार को ठीक करने की कोशिश कर सकते:

def change 
    change_column :reviews, :trip_id, :integer 
end 

और है कि अगर काम नहीं होता है ड्रॉप और टेबल को पुन:

def change 
    drop_table :reviews 
    create_table :reviews do |t| 
    #... 
    t.integer :trip_id 
    #... 
    end 
end 

तुम भी एक कर सकता है कच्चे एसक्यूएल के माध्यम से वैकल्पिक तालिका यदि आपके पास डेटा है जिसे आप संरक्षित करना चाहते हैं और change_column काम नहीं करता है:

def change 
    execute %q{ 
    alter table reviews 
    alter column trip_id 
    type int using cast(trip_id as int) 
    } 
end 

यह पोस्टग्रेएसक्यूएल (लेकिन SQLite नहीं) में काम करना चाहिए जब तक आपके trip_id में कोई टूटा हुआ डेटा न हो।

एक बार जब आप इसे हल कर लेंगे, तो आपको PostgreSQL इंस्टॉल करना होगा और अपने विकास पर्यावरण को उस पर स्विच करना चाहिए। SQLite के शीर्ष पर विकसित करना और PostgreSQL पर तैनाती (या एक डेटाबेस के शीर्ष पर विकास करना और उस मामले के लिए किसी अन्य डेटाबेस के शीर्ष पर तैनाती करना) एक बुरा विचार है और आपको सभी प्रकार के दुःख और भ्रम का कारण बनता है।

+0

धन्यवाद ! ऐसा लगता है कि, एक मॉडल बनाते समय, मैंने गलत टाइप किया (स्ट्रिंग के रूप में पूर्णांक)। – emilsw

+2

इसे स्थानीय रूप से नहीं देखा क्योंकि sqlite3 इसके साथ ठीक है। आप सही हैं, पीजी के शीर्ष पर विकास शुरू करने का समय। – emilsw

+0

हे @mu_is_too_short! यह एक लंबा समय रहा है;) प्रश्न, मैं उत्सुक हूं अगर यह अभी भी एक स्ट्रिंग के साथ ऐसा करना संभव होगा (यदि आपको वास्तव में करना था)। – Trip

1

आप एक पाठ/varchar डेटा प्रकार के रूप में स्तंभ छोड़ सकता है, और एक पूर्णांक के रूप में यह डाली ...

WHERE "reviews"."trip_id"::int = 32 
1

प्रवास करने के लिए एक आसान तरीका यह है:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)' 
संबंधित मुद्दे