2013-10-31 45 views
0

編輯︰我已經刪除並重新創建數據庫,建議在不同的答案,沒有變化。另外,我不能使用像acts_as_taggable這樣的寶石,因爲我使用的標籤與平時不同。如何正確定義此自定義標記關係?

關於堆棧溢出的第一個問題!我有一些麻煩,讓一個非常簡單的關聯正常工作,我不知道爲什麼。我花了很多時間看SO和文檔,在我看來,我應該工作。我添加了屬於用戶和訂單的「標籤」模型,並且我還向用戶和訂單模型添加了has_many:標籤。下面是我創建了模型的架構:

create_table "tags", force: true do |t| 
    t.string "name" 
    t.string "color" 
    t.integer "order_id" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

add_index "tags", ["order_id"], name: "index_tags_on_order_id", using: :btree 
add_index "tags", ["user_id"], name: "index_tags_on_user_id", using: :btree 

在軌控制檯,我可以創建一個標籤,與用戶的關聯:

this_tag = Tag.new(name:"Urgent", color: "red", user_id: 1) 

,我可以讓我的標籤與用戶

this_tag.user 

,但我不能讓我的用戶變量與

a_user = User.first 
a_user.tags 

這給了我:

User Load (0.9ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 
=> #<User id: 1, email: "redacted", encrypted_password: "$2a$10$kdEgXW61I3b3Bu9Rbs3W0ex1jxTmIFWVe1jabDY9q9.U...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 5, current_sign_in_at: "2013-10-29 22:12:57", last_sign_in_at: "2013-10-29 21:59:13", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-10-23 23:49:00", updated_at: "2013-10-29 22:12:57", name: "Jordan"> 
2.0.0-p247 :006 > me.tags 
PG::UndefinedTable: ERROR: relation "user_tags" does not exist 
LINE 5:    WHERE a.attrelid = '"user_tags"'::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 = '"user_tags"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "user_tags" does not exist 
LINE 5:    WHERE a.attrelid = '"user_tags"'::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 = '"user_tags"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 

這似乎是一個奇怪的錯誤,而且似乎沒有引用它的SO職位將有一個問題就是像我。我可以讓我的用戶訂單

a_user.orders 

和我的訂單模式的模式很相似,是,我沒有索引唯一的區別添加到我的訂單模型...

是該指數弄亂我的訂單?什麼導致了這個討厭的錯誤?

附加信息:

我一直有麻煩定義這種模式我怎麼想的那樣,所以我創造了約三遷移,然後捲回,並用git的復位 - 硬頭滾一切否則返回並每次重新開始。

按照要求,我的用戶模型是:

class User < ActiveRecord::Base 
    has_many :orders 
    has_many :tags 
    rolify 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

和我的標籤模型是

class Tag < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :order 
end 
+0

在我看來,您沒有正確定義模型中的關聯。您是否請將您的代碼發佈到您的用戶模型和標籤模型? –

+0

感謝您的迴應!我已經發布了這些內容,但我認爲他們沒有任何問題。 –

+0

我有三種調查方式,雖然這很難從遠方排除故障:(1)發佈你的數據庫/模式。(2)確保你連接到正確的數據庫,並(3)從用戶移除'rolify'和'devise'以確保這些沒有意外的互動。 –

回答

0

我找到了問題的原因,它肯定是我的錯。之前的標籤模型遷移版本在名爲users的文件夾內留下了額外的tag.rb模型。我想我只是沒有注意到該文件夾​​,或者認爲它與用戶模型有關。我也會想到,運行git reset - hard HEAD會恢復我所做的任何更改,但是這會通過某種方式滑落 - 也許它不會添加到我的索引中? 無論如何,這是一個額外的tag.rb模型,造成了這個問題。