2015-06-21 48 views
2

我在事件和用戶之間有一個has_and_belongs_to_many關係。Rails 4 - 銷燬HABTM記錄導致未定義表

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. 銷燬事件(來自事件表)

所以我寫了這個代碼來實現這一目標:

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_ 角色是出於藍)

幫助表示讚賞。

回答

0

這將與您在Event類中的'rolify'相關。

class Event < ActiveRecord::Base 
    rolify 
    ... 

這是Rolify寶石,它可能會在數據庫中生成額外的表/字段。

+0

好的!我想我應該只是「rolify」用戶模型。我從event.rb中刪除了rolify並且它正在工作。謝謝nesiseka! – Mike

+0

太好了。如果答案合適,一定要接受它! – nesiseka

+0

我在嘗試,但有一段時間的延遲。現在接受! – Mike