簡體   English   中英

ActiveRecord :: StatementInvalid:Mysql2 :: Error:表不存在

[英]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中,約定是:

  • 模型名稱必須始終為“ Singular”(即MessagesUser)
  • 數據庫和集合名稱將始終為“復數”(即,messages_users)

令人困惑的部分是,您的模型名稱是兩個單詞的串聯,因此很可能其中一個單詞是復數形式而另一個單詞卻沒有混淆。 您可以像這樣保留它,也可以只用一個詞定義“直通”模型。

嘗試用諸如“用戶通過收件箱收到許多郵件”之類的詞說出來。 在這種情況下,您的“直通”模型可以稱為收件箱(具有多個收件箱)。

無論哪種方式,只要您遵循約定,它都將起作用:)希望這會有所幫助!

對於該用戶和消息,我只有兩個模型。

在消息中,我將提供兩個字段sender_id和Received_id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM