ruby-on-rails - ActiveRecord destroy_all 抛出 StatementInvalid

标签 ruby-on-rails ruby activerecord

我在 Ruby on Rails 上使用 ActiveRecord 和 oracle 适配器。尝试删除行时出现 StatementInvalid Exception

这是我的 table 的样子:room_user_table

room | user
1010 | a
1010 | b
1011 | a
1011 | c
1011 | d

我的 ruby​​ ActiveRecord 类:

class RoomUserTable < ActiveRecord:Base
    self.table_name = 'room_user_table'
end

例如,现在我想删除第二行,所以我发出

RoomUserTable.destroy_all(:room => 1010, :user => 'b')

但这是抛出 ActiveRecord::StatementInvalid 异常

OCIError: ORA-01741: illegal zero-length identifier: DELETE FROM "ROOM_USER_TABLE" WHERE "ROOM_USER_TABLE"."" = :a1

如有任何帮助,我们将不胜感激。

我的测试 Controller .rb

class TestController < ActionController::Base
    def test
       RoomUserTable.destroy_all(:room => 1010, :user => 'b')
    end
end

最佳答案

您的 RoomUserTable 没有主键,这导致它运行您在问题 WHERE "ROOM_USER_TABLE".""= ... 这反过来又导致 Oracle 抛出一个不稳定的问题。 Rails 模型需要有主键。

该表看起来像一个连接表,因此您根本不需要为其创建模型或直接查询它。您可以在 UserRoom 之间使用 has_and_belongs_to_many 关系并指定连接表。

class Room < ActiveRecord::Base
  has_and_belongs_to_many :users, join_table: :room_user_table
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :rooms, join_table: :room_user_table
end

或类似的。

编辑 - 已经说过您的用户列中有 ab 等,所以我不知道那个表是什么,但问题仍然是同样,您没有主键。

关于ruby-on-rails - ActiveRecord destroy_all 抛出 StatementInvalid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17720312/

相关文章:

ruby-on-rails - 给定 Rails 5 has_and_belongs_to_many,如何创建连接记录?

ruby-on-rails - 找不到 JavaScript 运行时。有关可用运行时的列表,请参阅 https://github.com/rails/execjs。 (ExecJS::运行时不可用)

ruby-on-rails - 提交帖子并获取和接收 ruby​​ 中的响应页面(外部网站)

ruby-on-rails - gmaps4rails validates before validates presence set to true

ruby-on-rails - 施普雷的铁路路线

java - 可移植运行时?

ruby-on-rails - Rails Associations - 强大的参数构建

ruby-on-rails - Rails - 跨 3 个表的事件记录联接

ruby-on-rails - 为 Rspec 测试填充在父 Controller 中定义的实例变量

ruby-on-rails - carrierwave gem 可以同时在 AWS-S3 和本地文件系统上存储文件吗?