2016-03-11 6 views
1

Я работаю в чате, используя отношения HABTM. В принципе, у пользователей много чатов, и у чатов много пользователей. Вот чат:Как я могу продолжать отношения HABTM?

class Chat < ActiveRecord::Base 

    has_and_belongs_to_many :users 
    has_many :messages, dependent: :destroy 

end 

И вот Пользователю

class User < ActiveRecord::Base 

    has_and_belongs_to_many :chats 
    ... 

Я получил мои таблицы, несколько пользователей и несколько удовольствия

В консоли Rails, я попытался

User.find(1).chats << Chat.find(1)

Но когда я печатаю User.find (1) .chats, я получаю [] Я также попытался с

user = User.find(1)

user.chats << Chat.find(1)

user.save

Не работает. Что мне не хватает?

Вот миграция для HABTM

class CreateChatsUsers < ActiveRecord::Migration 
    def change 
    create_table :chats_users do |t| 
     t.belongs_to :chat, index: true 
     t.belongs_to :user, index: true 
    end 
    end 
end 

EDIT - Использование has_many, through: отношения

Чат:

class Chat < ActiveRecord::Base 

has_many :messages, dependent: :destroy 
has_many :users, through: :messages 

end 

Пользователь:

class User < ActiveRecord::Base 

    has_many :messages, dependent: :destroy 

    has_many :chats, through: :messages 
.... 

Сообщение:

class Message < ActiveRecord::Base 
    belongs_to :chat 
    belongs_to :user 
end 

И, наконец, миграция:

class CreateMessages < ActiveRecord::Migration 
    def change 
    create_table :messages do |t| 
     t.belongs_to :chat, index: true 
     t.belongs_to :user, index: true 
     t.datetime :message_date 
     t.timestamps null: false 
    end 
    end 
end 

Я пропускаю что-нибудь?

+0

Weird, ум назначая все, и убедившись, что все настоящее? – fbelanger

+1

Можете ли вы показать свою миграцию для users_chats? – sebsonic2o

+1

Большинство людей в эти дни рекомендуют использовать 'has_many, через:' отношения. Вот последняя статья на эту тему. http://cobwwweb.com/why-i-dont-use-has-and-belongs-to-many-in-rails. Я понимаю, что это не ответит на ваш вопрос напрямую, но я настоятельно рекомендую переключиться, если вы в состоянии. –

ответ

0

Итак, я, наконец, нашел свою ошибку.

Прежде всего, да, лучше использовать отношения HMT. Вы можете использовать тот, который я опубликовал в своем последнем редактировании.

Все, что вам нужно сделать, это убедиться, что у вас есть пользователь, чат, и сообщение, которое связывает оба эм (это один я пропустил)

0

Я считаю, что RoR не позволит HABTM работать, если у вас нет id: false в вашей миграции. Смотрите ниже:

class CreateChatsUsers < ActiveRecord::Migration 
    def change 
    create_table :chats_users, id: false do |t| 
     t.belongs_to :chat, index: true 
     t.belongs_to :user, index: true 
    end 
    end 
end 

Если вы просто экспериментируете на вашей локальной среде разработки, вы можете просто изменить свою миграцию, а затем rake db:drop db:create db:migrate. Это приведет к сбросу базы данных и выполнению всех ваших миграций. Нельзя делать в производстве!

Если нет, вы можете создать новую миграцию rails g migration remove_id_from_chats_users id:primary_key, чтобы удалить столбец id, и запустите rake db:migrate.

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