[英]ActiveRecord::StatementInvalid — Mysql2::Error: Table 'database.table_that_I_want_to_create' doesn't exist
[英]ActiveRecord::StatementInvalid: Mysql2::Error: Table doesn't exist
我正在嘗試為此創建簡單的內部消息傳遞服務,以便使用身份驗證進行設計,以便獲得用戶表。 我已經創建了一個用於消息的消息表和一個名為messages_users的聯接表。 我想通過關聯使用has_many,所以我的關聯如下:-
user.rb:-
has_many :sent_messages, class_name: "Message", foreign_key: "user_id"
has_many :message_users
has_many :received_messages, through: :message_users, source: :message
message.rb:-
belongs_to :user
has_many :message_users
has_many :receivers, through: :message_users, source: :user
message_user.rb:-
class MessageUser < ActiveRecord::Base
belongs_to :user
belongs_to :message
end
和schema.rb:-
ActiveRecord::Schema.define(version: 20130912100741) do
create_table "messages", force: true do |t|
t.text "subject"
t.text "body", limit: 2147483647
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "messages_users", id: false, force: true do |t|
t.integer "user_id", null: false
t.integer "message_id", null: false
end
add_index "messages_users", ["message_id"], name: "index_messages_users_on_message_id", using: :btree
add_index "messages_users", ["user_id"], name: "index_messages_users_on_user_id", using: :btree
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "confirmation_token"
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.string "unconfirmed_email"
t.integer "failed_attempts", default: 0
t.string "unlock_token"
t.datetime "locked_at"
t.string "authentication_token"
t.datetime "created_at"
t.datetime "updated_at"
t.string "provider"
t.string "uid"
t.string "name"
end
add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
add_index "users", ["unlock_token"], name: "index_users_on_unlock_token", unique: true, using: :btree
end
當我使用user_object.sent_messages時,它工作正常,但是當我使用user_object.received_messages時,它給了我Mysql2 :: Error:表'to_do.message_users'不存在:從message_users ActiveRecord顯示完整字段ActiveRecord :: StatementInvalid:Mysql2 :: Error:表'to_do.message_users'不存在錯誤。 我只想使用has_many而不是habtm。 這里有一些關於stackoverflow的問題,但是沒有一個問題解決了我的問題,所以有什么建議嗎?
在Rails中,我們依靠“約定之上的配置”來定義很多魔術。 這里發生的事情是“通過”模型的多元性只是有些混亂。
試試看:
user.rb
has_many :sent_messages, class_name: "Message", foreign_key: "user_id"
has_many :messages_users
has_many :received_messages, through: :messages_users, source: :message
message.rb
belongs_to :user
has_many :messages_users
has_many :receivers, through: :messages_users, source: :user
messages_user.rb
class MessagesUser < ActiveRecord::Base
belongs_to :user
belongs_to :message
end
schema.rb-與您使用“ create_table messages_users”所使用的相同...
本質上,在Rails中,約定是:
令人困惑的部分是,您的模型名稱是兩個單詞的串聯,因此很可能其中一個單詞是復數形式而另一個單詞卻沒有混淆。 您可以像這樣保留它,也可以只用一個詞定義“直通”模型。
嘗試用諸如“用戶通過收件箱收到許多郵件”之類的詞說出來。 在這種情況下,您的“直通”模型可以稱為收件箱(具有多個收件箱)。
無論哪種方式,只要您遵循約定,它都將起作用:)希望這會有所幫助!
對於該用戶和消息,我只有兩個模型。
在消息中,我將提供兩個字段sender_id和Received_id。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.