3

我在 Ruby on Rails 上使用 ActiveRecord 和 oracle 适配器。我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

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

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
4

3 回答 3

1

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

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

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-18T12:01:19.810 回答
0

尝试这个

RoomUserTable.where(:room => 1010, :user => 'b').first.destroy
于 2013-07-18T10:23:08.130 回答
0

要删除单个记录,您应该这样做

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

我建议这样做的原因是因为它比 destroy_all 更安全,但仅在您尝试删除单个记录时才有意义。

当然,最好的办法是通过 id 查找记录。

这也应该有效,但鉴于您的问题,我不确定。

RoomUserTable.where(:room => 1010, :user => 'b').destroy_all
于 2013-07-18T10:03:05.183 回答