Rails:如何修复 ActiveRecord::不可逆的订单错误

Posted

技术标签:

【中文标题】Rails:如何修复 ActiveRecord::不可逆的订单错误【英文标题】:Rails:How to fix ActiveRecord::Irreversible Order Error 【发布时间】:2018-03-13 12:29:31 【问题描述】:

我收到以下错误:

2.4.1 :001 > Blogger.last
ActiveRecord::IrreversibleOrderError: Relation has no current order and table has no primary key to be used as default order from (irb):1

有什么问题,我该如何解决?

更多信息:

Blogger.first 似乎有效:

Blogger.first
Blogger Load (3.6ms)  SELECT  "bloggers".* FROM "bloggers" LIMIT $1  [["LIMIT", 1]]

#<Blogger id: 1, blogger_id: 502, deadline: nil, reminded: nil, needsreminder: nil, created_at: "2018-03-13 12:10:09", updated_at: "2018-03-13 12:10:09", interests: "Ethik, Gesellschaft, Kultur, Logik, Wissen, Wissen..."> 

Blogger 是使用种子创建的:

Blogger.create!([
  id: 1, blogger_id: 502, deadline: nil, reminded: nil, needsreminder: nil, interests: "Ethik, Gesellschaft, Kultur, Logik, Wissen, Wissenschaft",
  id: 2, blogger_id: 453, deadline: nil, reminded: nil, needsreminder: nil, interests: "Ethik, Gesellschaft, Kultur",
  id: 3, blogger_id: 434, deadline: nil, reminded: nil, needsreminder: nil, interests: "Menschsein und Sprache",
  id: 4, blogger_id: 370, deadline: nil, reminded: nil, needsreminder: nil, interests: "Ethik, Gesellschaft, Kultur",
  id: 5, blogger_id: 485, deadline: nil, reminded: nil, needsreminder: nil, interests: "Unbekannt"
])

这些是 Blogger 的迁移:

class CreateBloggers < ActiveRecord::Migration[5.1]
  def change
    create_table :bloggers do |t|
      t.integer :blogger_id
      t.date :deadline
      t.date :reminded
      t.boolean :needsreminder

      t.timestamps
    end
  end
end


class AddInterestsToBloggers < ActiveRecord::Migration[5.1]
  def change
    add_column :bloggers, :interests, :string
  end
end

Blogger.rb

class Blogger < ApplicationRecord


end

导轨:5.1.4

红宝石:2.4.1

Postgresql:x86_64-pc-linux-gnu 上的 PostgreSQL 9.5.12,由 gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609,64 位编译

【问题讨论】:

可以显示执行Blogger.first时生成的SQL吗? 还有default_scope定义在Blogger上吗? @MoMolog 我更新了我的问题。范围是在 blogger.rb 中定义的,对吧?我在 Blogger.rb 中没有看到任何内容 【参考方案1】:

我回滚了我的迁移,然后再次迁移它们。

rails db:rollback
rails db:migrate
rails db:seed

之后,错误不再出现:

2.4.1 :002 > Blogger.last
  Blogger Load (1.5ms)  SELECT  "bloggers".* FROM "bloggers" ORDER BY "bloggers"."id" DESC LIMIT $1  [["LIMIT", 1]]
 => #<Blogger id: 5, blogger_id: 485, deadline: nil, reminded: nil, needsreminder: nil, created_at: "2018-03-13 19:58:33", updated_at: "2018-03-13 19:58:33", interests: "Unbekannt"> 
2.4.1 :003 > 

但是,如果有人能解释如果发生这种错误该怎么办,我仍然会很高兴。

【讨论】:

我偶然发现了同样的错误。发现表上缺少 PRIMARY KEY 约束。在没有回滚的情况下,更新了数据库并创建了主键索引,从而解决了问题。如果你去查看源代码,它会说:“当关系的顺序太复杂以至于 +reverse_order+ 无法自动反转时,会引发 IrreversibleOrderError。”【参考方案2】:

我只是重新指定了主键,没有在模型文件中提及任何内容。

注意:我实际上是使用现有的表创建了一个新表并出现此错误。

创建表后,我在迁移文件中指定了以下内容,

execute "ALTER TABLE items ADD PRIMARY KEY (id);"

【讨论】:

以上是关于Rails:如何修复 ActiveRecord::不可逆的订单错误的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何在 ActiveRecord 中设置默认值?

如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?

rails/mysql - 我如何消除 ActiveRecord::StatementInvalid 错误?

如何编写迁移以重命名 Rails 中的 ActiveRecord 模型及其表?

Rails 5:ActiveRecord OR 查询

如何从 Rails 中的查询中排除 id 数组(使用 ActiveRecord)?