我在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
答案 0 :(得分:1)
您的RoomUserTable
没有主键,这会导致它运行您在问题WHERE "ROOM_USER_TABLE"."" = ...
中的查询,这反过来又会导致Oracle失败。 Rails模型需要有主键。
该表看起来像一个连接表,因此您无需为其创建模型或直接查询它。您可以在has_and_belongs_to_many
和User
之间使用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
或类似。
编辑 - 说您的用户列中有a
,b
等,所以我不知道该表是什么,但问题仍然是相同的,你不是有一把主键。
答案 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