3

Ruby on Rails で Oracle アダプタを使用して ActiveRecord を使用しています。StatementInvalid Exception行を削除しようとすると、エラーが発生します。

私のテーブルがどのように見えるかは次のとおりです。

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 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
4

3 に答える 3

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

または類似。

編集 - user 列にa, betc があると言ったので、そのテーブルが何であるかはわかりませんが、問題は同じで、主キーがありません。

于 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 に答える