我正在尝试创建简单的内部消息服务,因为我使用了设计进行身份验证,所以我有用户表。我创建了一个消息消息表和一个名为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 ::错误:表'to_do.message_users'不存在:显示完全来自 message_users ActiveRecord :: StatementInvalid:Mysql2 :: Error:表'to_do.message_users'不存在错误。我想只使用has_many而不是habtm。这里有一些关于stackoverflow的问题,但没有一个问题解决了我的问题所以有任何建议吗?
答案 0 :(得分:1)
在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中,惯例是:
令人困惑的部分是你的模型名称是两个单词的串联,因此可能是其中一个是复数而另一个不是混淆的事实。你可以这样离开,或者只是用一个词来定义“通过”模型。
尝试用“用户通过收件箱收到许多邮件”之类的文字说出来。在这种情况下,您的“通过”模型可以称为收件箱(带有多个收件箱)。
无论哪种方式,只要遵循惯例,它就会起作用:)希望这会有所帮助!
答案 1 :(得分:0)
此用户和消息我只有两个模型。
在消息中,我会给两个字段sender_id和received_id。