我在Rails上使用带有oracle适配器的ActiveRecord。当我试图删除一行时,我得到了一个StatementInvalid Exception。
下面是我的桌子的样子:room_user_table
room | user
1010 | a
1010 | b
1011 | a
1011 | c
1011 | d我的红宝石ActiveRecord类:
class RoomUserTable < ActiveRecord:Base
self.table_name = 'room_user_table'
end现在我想删除第2行,所以我要发出
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任何帮助都将不胜感激。
我的test_controller.rb
class TestController < ActionController::Base
def test
RoomUserTable.destroy_all(:room => 1010, :user => 'b')
end
end发布于 2013-07-18 12:01:19
您的RoomUserTable没有主键,这导致它运行您在问题WHERE "ROOM_USER_TABLE"."" = ...中的查询,而这反过来又导致WHERE "ROOM_USER_TABLE"."" = ...抛出一个抖动。Rails模型需要有主键。
该表看起来像一个连接表,因此您根本不需要为它创建模型或直接查询它。您可以在User和Room之间使用一个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等,所以我不知道该表是什么,但是问题仍然是一样的,您没有主键。
发布于 2013-07-18 10:03:05
若要删除simgle记录,请执行以下操作
RoomUserTable.where(:room => 1010, :user => 'b').first.destroy我建议这样做的原因是因为它比destroy_all安全,但只有在尝试删除单个记录时才有意义。
当然,最好的办法是通过id找到一份记录。
这也应该有效,但考虑到你的问题,我不确定。
RoomUserTable.where(:room => 1010, :user => 'b').destroy_all发布于 2013-07-18 10:23:08
尝尝这个
RoomUserTable.where(:room => 1010, :user => 'b').first.destroyhttps://stackoverflow.com/questions/17720312
复制相似问题