0

Я пытаюсь создать простую внутреннюю службу обмена сообщениями, для которой я использовал устройство для аутентификации, поэтому у меня есть таблица пользователей. Я создал таблицу сообщений для сообщений и таблицу соединений, называемую messages_users. Я хочу использовать has_many через ассоциацию, так что мои ассоциации, как это: -ActiveRecord :: StatementInvalid: Mysql2 :: Ошибка: таблица не существует

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' не существует: SHOW FULL FIELDS FROM message_users ActiveRecord: : StatementInvalid: Mysql2 :: Ошибка: таблица 'to_do.message_users' не существует ошибка. Я хочу использовать has_many только и не habtm. Здесь было несколько вопросов о stackoverflow, но никто из них не решил мою проблему, поэтому никаких предложений?

+0

Вы пробовали переименовать стол, как я уже говорил в ответ? – derekyau

ответ

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_use RS»...

По существу, в Rails конвенции является то, что:

  • Название модели всегда должна быть "болванка"(то есть. MessagesUser)
  • имен баз данных и коллекций всегда будут «множественном» (то есть. Messages_users)

Запутанная часть этого является то, что название модели представляет собой объединение двух слов и поэтому, вероятно, тот факт, что один из они плюрализованы, а другие не сбивают с толку. Вы можете либо оставить его так, либо просто использовать одно слово, чтобы определить «сквозную» модель.

Попробуйте сказать словами что-то вроде «У пользователя много сообщений через Входящие». В этом случае ваша «сквозная» модель может быть названа «Входящие» (с множественным числом «Входящие»).

В любом случае, он будет работать до тех пор, пока вы будете следовать соглашению :) надеюсь, что это поможет!

+0

да это должно быть первое беспокойство –

+0

@SabyasachiGhosh ahh извините, мой плохой .. но все же он не решился на ошибку – Mandeep

+0

предоставить имя класса и внешний ключ для получения_массы –

0

У меня было бы только две модели для этого пользователя и сообщений.

В сообщениях я бы дал два поля sender_id и received_id.

Смежные вопросы