Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道3.1。Heroku PGError:运算符不存在:字符变化=整数_Ruby On Rails_Postgresql_Sqlite_Heroku - Fatal编程技术网

Ruby on rails 轨道3.1。Heroku PGError:运算符不存在:字符变化=整数

Ruby on rails 轨道3.1。Heroku PGError:运算符不存在:字符变化=整数,ruby-on-rails,postgresql,sqlite,heroku,Ruby On Rails,Postgresql,Sqlite,Heroku,在纠正错误方面有点困难 所有这些都在本地机器上运行良好。 在PG上,heroku是错误的 以下是日志: ←[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]:←[0

在纠正错误方面有点困难

所有这些都在本地机器上运行良好。 在PG上,heroku是错误的

以下是日志:

  ←[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>
让我困惑的是,我还有另外两个几乎相同的模型,但它们工作得很好

谢谢

您的问题在于:

WHERE "reviews"."trip_id" = 32
错误信息显示:

运算符不存在:字符变化=整数

因此,您在评论中将trip_id列创建为字符串,而不是整数。这在SQLite中可以很好地工作,因为SQLite的类型系统非常松散,但在PostgreSQL中不起作用,因为PostgreSQL要严格一些

您可以尝试添加迁移以修复trip_id的类型:

如果不起作用,则删除并重新创建表:

def change
  drop_table :reviews
  create_table :reviews do |t|
    #...
    t.integer :trip_id
    #...
  end
end
如果您有要保留的数据,并且change_列不起作用,也可以通过原始SQL执行ALTER TABLE:

def change
  execute %q{
    alter table reviews
    alter column trip_id
    type int using cast(trip_id as int)
  }
end
这在PostgreSQL中应该可以使用,但在SQLite中不能使用,只要trip_id中没有任何损坏的数据


一旦解决了这个问题,就应该安装PostgreSQL并将开发环境切换到该环境。在SQLite之上开发并部署到PostgreSQL,或者在一个数据库之上开发并部署到任何其他数据库之上,这都是一个坏主意,会给您带来各种痛苦和困惑。

您可以将列保留为text/varchar数据类型,并将其转换为整数

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

进行迁移的一种更简单的方法是:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)'

谢谢看起来,在创建模型时,我错误地将整数输入为字符串。在本地没有看到它,因为sqlite3可以使用它。你说得对,是时候开始在PG上开发了。嘿@mu_太短了!已经很久了;问题,我很好奇,如果你真的必须这样做的话,是否仍然可以用字符串来实现这一点。@Trip我想你必须在那里得到一个类型强制转换,要么像下面的Stud au那样在左边是::int,要么像右边的::text,要么使用标准的castx作为整数或castx作为文本语法。
change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)'