我正在尝试解决我的heroku问题,它似乎有问题
我们很抱歉,但出了点问题。 我们已经收到有关此问题的通知,我们很快就会对其进行审核。
我有什么错误以及如何克服它? 我怎样才能解释这些Heroku日志?
ActionView::Template::Error (PGError: ERROR: column "microposts.created_at" must appear in the GROUP BY clause or be used in an aggregate function
2011-11-14T17:33:07+00:00 app[web.1]: : SELECT category FROM "microposts" GROUP BY category ORDER BY microposts.created_at DESC):
2011-11-14T17:33:07+00:00 app[web.1]: 2: <% @categories= Micropost.select("category").group("category")%>
2011-11-14T17:33:07+00:00 app[web.1]: 3: <% unless @categories.nil? %>
2011-11-14T17:33:07+00:00 app[web.1]: 4:
2011-11-14T17:33:07+00:00 app[web.1]: 5: <ul><% @categories.each do |category| %>
2011-11-14T17:33:07+00:00 app[web.1]: 6: <li><%= link_to category.category, :controller =>"microposts", :category => category.category, :method => 'category_list' %></li>
2011-11-14T17:33:07+00:00 app[web.1]: 7: <% end %>
2011-11-14T17:33:07+00:00 app[web.1]: 8: </ul>
微博模型(新添加)
class Micropost < ActiveRecord::Base
belongs_to :users
default_scope :order => 'microposts.created_at DESC'
attr_accessible :title,:content,:category
validates :user_id, :presence => true
validates :title, :presence => true,
:length => {:maximum =>500}
validates :content, :presence => true,
:length => {:maximum =>3000}
validates :category, :presence => true
end
答案 0 :(得分:4)
您当前的问题是您为PostgreSQL生成了无效的SQL:
SELECT category FROM "microposts" GROUP BY category ORDER BY microposts.created_at DESC
您的ORDER BY与查询的其余部分不匹配。您不能在分组查询中使用列,除非该列也已分组,或者该列出现在聚合函数中,这就是错误消息的含义。原因是当一组行由GROUP BY子句组合时,PostgreSQL将不知道要使用哪一行created_at
;一些数据库会默默地自己选择一行,PostgreSQL更喜欢严格,希望你自己消除歧义。
尝试自己指定订单:
@categories = Micropost.select("category").group("category").order("category")
另一个选择是使用DISTINCT而不是GROUP BY来避免重复:
@categories = Micropost.select('DISTINCT(category)')
顺便说一句,你真的不应该在视图中做那种事情,你可能想把它移到你的控制器上。
您真正的问题是,您在一个数据库上进行开发,而在另一个数据库上进行部署。我建议您将开发环境切换到PostgreSQL 8.3(如果要部署到Heroku共享数据库)或PostgreSQL 9.0(如果要部署到专用数据库)。
答案 1 :(得分:2)
您是否在使用MySQL开发应用程序? Heroku不包括MySQL。它使用postgreSQL。在这里查看这个问题 - PostgreSQL GROUP BY different from MySQL?
我引用 -
MySQL完全不符合标准的GROUP BY可以由Postgres的DISTINCT ON模拟。考虑一下:
mysql:
SELECT a,b,c,d,e FROM table GROUP BY a
每个a的值提供1行(哪一个,你真的不知道)。实际上你可以猜到,因为MySQL不知道哈希聚合,所以它可能会使用排序...但它只会对a进行排序,因此行的顺序可能是随机的。除非它使用多列索引而不是排序。好吧,无论如何,它没有被查询指定。
postgres:SELECT DISTINCT ON (a) a,b,c,d,e FROM table ORDER BY a,b,c
这为a每个值提供1行,该行将是根据查询指定的ORDER BY排序中的第一行。简单。