我在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件事并正确地将它们放入:
你可以自己去试试: http://couplesbudget.herokuapp.com/envelopes/6/edit
用户名:test@test.com 密码:test123456
UPDATE2
我在我的开发电脑上重新创建了上述情况(使用mysql),这是我得到的细节:
正如您所见,信封1是在3:25:06创建的 如你所见,信封2是在3:25:11创建的 如你所见,信封3是在3:25:19创建的
以下是编辑中的数据:
然后改变:
正如您所见,信封1是在3:25:06创建的 如你所见,信封2是在3:25:11创建的 如你所见,信封3是在3:25:19创建的
所以它没有改变。为什么postgresql没有正确排序实例?
答案 0 :(得分:1)
据推测,你有这样的模型:
class Transaction < ActiveRecord::Base
belongs_to :envelope
end
class Envelope < ActiveRecord::Base
has_many :transactions
end
因此,@envelope
为Envelope
,并通过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都不会为您提供数据库可移植性。