【问题标题】:Rails 4 - destroying a HABTM record results in UndefinedTableRails 4 - 在 UndefinedTable 中销毁 HABTM 记录
【发布时间】:2015-06-21 23:13:36
【问题描述】:

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

用户.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

事件.rb

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

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

  1. 删除所有关联(从 events_users 表中)
  2. 销毁事件(来自事件表)

所以我写了这段代码来完成这个:

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_roles”表,我不明白为什么。

(events_users 是有道理的,但 events_roles 是出乎意料的)

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    这将与您在 Event 类中的“rolify”有关。

    class Event < ActiveRecord::Base
      rolify
      ...
    

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

    【讨论】:

    • 好的!我想我应该只“改变”用户模型。我从 event.rb 中删除了 rolify 并且它正在工作。谢谢你 nesiseka!
    • 我正在尝试,但有一个时间延迟。现在接受!
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多