Rails 4 - 销毁HABTM记录导致UndefinedTable

时间:2015-06-21 15:08:39

标签: ruby-on-rails ruby has-and-belongs-to-many

我在事件和用户之间有一个has_and_belongs_to_many关系。

user.rb

class User < ActiveRecord::Base
  rolify
  has_and_belongs_to_many :events, join_table: :events_users
  after_create :assign_default_role

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

   def assign_default_role
     add_role(:basic)
   end
end

event.rb

class Event < ActiveRecord::Base
  rolify
  has_and_belongs_to_many :users, join_table: :events_users
end

当我想删除一个事件时,我会做两件事:

  1. 删除所有关联(来自events_users表)
  2. 销毁事件(来自事件表)
  3. 所以我写了这段代码来实现这个目标:

    events_controller.rb

      def destroy
        @event.users.clear #remove all associations
        @event.destroy #destroy event
    
        respond_to do |format|
          flash[:success] = 'Event was successfully deleted.'
          format.html { redirect_to events_url }
          format.json { head :no_content }
        end
      end
    

    清除联接表中的关联(@ event.users.clear)。

    我在尝试销毁实际事件时遇到错误(@ event.destroy)。

      (0.7ms)  BEGIN
      SQL (0.4ms)  DELETE FROM "events_users" WHERE "events_users"."event_id" = $1  [["event_id", 13]]
    PG::UndefinedTable: ERROR:  relation "events_roles" does not exist
    LINE 5:                WHERE a.attrelid = '"events_roles"'::regclass
                                              ^
    :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                         pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"events_roles"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum
    
       (0.3ms)  ROLLBACK
    ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "events_roles" does not exist
    LINE 5:                WHERE a.attrelid = '"events_roles"'::regclass
                                              ^
    :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                         pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"events_roles"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum
    

    它似乎正在寻找“events_ 角色 ”表格,我不明白为什么。

    (events_ 用户有意义,但events_ 角色突然出现)

    帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

这与您在Event类中的'rolify'有关。

class Event < ActiveRecord::Base
  rolify
  ...

这是Rolify gem,它可能在DB中生成额外的表/字段。