ActiveRecord destroy_all抛出StatementInvalid

时间:2013-07-18 10:00:49

标签: ruby-on-rails ruby activerecord

我在Ruby on Rails上使用ActiveRecord和oracle适配器。我试图删除一行时得到StatementInvalid Exception

以下是我的表格如下: 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 Exception

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

非常感谢任何帮助。

我的test_controller.rb

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

3 个答案:

答案 0 :(得分:1)

您的RoomUserTable没有主键,这会导致它运行您在问题WHERE "ROOM_USER_TABLE"."" = ...中的查询,这反过来又会导致Oracle失败。 Rails模型需要有主键。

该表看起来像一个连接表,因此您无需为其创建模型或直接查询它。您可以在has_and_belongs_to_manyUser之间使用Room关系,并指定联接表。

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等,所以我不知道该表是什么,但问题仍然是相同的,你不是有一把主键。

答案 1 :(得分:0)

删除你应该做的simgle记录

RoomUserTable.where(:room => 1010, :user => 'b').first.destroy

我建议的原因是因为它比destroy_all更安全,但只有在你试图删除单个记录时才有意义。

最好的方法是按身份查找记录。

这也应该有用,但考虑到你的问题,我不确定。

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

答案 2 :(得分:0)

试试这个

RoomUserTable.where(:room => 1010, :user => 'b').first.destroy