来自postgresql的Rails Ordered列表是无序的

时间:2014-09-12 01:53:44

标签: postgresql activerecord ruby-on-rails-4 rails-activerecord

我在rails中有一个.each Do循环,可以在MySQL上运行正常但是当我将它上传到Heroku(因此Postgres)时它无法正常工作。

我想要按时间排序项目,最好是最新的。这是我的第一段代码:

<% @envelope.transactions('created_at DESC').reverse.each do |transaction|%>

当我注意到Postgresql的问题时,我环顾四周并将代码切换到以下内容,它仍然可以在mysql上运行,但它仍然无法在Heroku上运行:

<% @envelope.transactions(:order=>'DATE(created_at) DESC').reverse.each do |transaction|%>

无论如何,我很茫然,主要是因为我对数据库一无所知。如何让Postgres在Rails 4中回应我的请求,将最新的请求放在最顶层?

谢谢!

更新:

以下是一些示例输出,作为我所说的内容的一个例子:

我输入了3件事并正确地将它们放入:

First Image

After Edit, order changed

你可以自己去试试: http://couplesbudget.herokuapp.com/envelopes/6/edit

用户名:test@test.com 密码:test123456

UPDATE2

我在我的开发电脑上重新创建了上述情况(使用mysql),这是我得到的细节: first stuff

正如您所见,信封1是在3:25:06创建的 如你所见,信封2是在3:25:11创建的 如你所见,信封3是在3:25:19创建的

以下是编辑中的数据: enter image description here

然后改变:

正如您所见,信封1是在3:25:06创建的 如你所见,信封2是在3:25:11创建的 如你所见,信封3是在3:25:19创建的

所以它没有改变。为什么postgresql没有正确排序实例?

1 个答案:

答案 0 :(得分:1)

据推测,你有这样的模型:

class Transaction < ActiveRecord::Base
  belongs_to :envelope
end
class Envelope < ActiveRecord::Base
  has_many :transactions
end

因此,@envelopeEnvelope,并通过transactions关联获取has_many :transactions方法。这意味着transactions方法并不关心你给它的参数,这些参数完全相同:

@envelope.transactions('created_at DESC')
@envelope.transactions(:order=>'DATE(created_at) DESC')
@envelope.transactions(:where_is_pancakes_house?)
@envelope.transactions

并且该事情不涉及向数据库发送ORDER BY。如果你没有告诉数据库你想要什么样的订单那么你不应该指望它们以任何特定的顺序出现;您在本地MySQL中看到的结果要么是偶然的,要么是MySQL实现细节。

如果您想按特定顺序获取数据,请说明:

@envelope.transactions.order('created_at desc').reverse

或者只是按升序排序并跳过reverse

@envelope.transactions.order(:created_at).reverse
BTW,在一个数据库上进行开发并在另一个数据库上进行部署是一种灾难。无论营销声明如何,ActiveRecord都不会为您提供数据库可移植性。