2015-02-13 3 views
0

Im пытается создать систему обмена сообщениями в Rails. Объединение пользователей к разговорам должно быть доброго для многих, так что пользователи могут иметь несколько разговоров и разговоров нескольких пользователей. Поэтому я создал пользователей трех таблиц, цепочек бесед и разговоров и модели для каждого.Ruby on Rails - много для ассоциации с моделью

модели выглядят как:

class User < ActiveRecord::Base 
    has_many :conversation_relations 
    has_many :conversations, through: :conversation_relations 
end 

class Conversation < ActiveRecord::Base 
    has_many :conversation_relations 
    has_many :users, through: :conversation_relations 
end 

и

class ConversationRelation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :conversation 
end 

Моя проблема, когда я пытаюсь назначить нескольких пользователей к разговору, запись в таблице conversation_relations обновляется вместо создания новая запись.

например. (На консоли):

conversation = Conversation.create() 
user1 = User.find(1) 
user2 = User.find(2) 
relation = ConversationRelation.new() 

conversation.conversation_relations << relation 
user1.conversation_relations << relation 
user2.conversation_relations << relation 

Проблема возникает в последней строке, потому что он обновляет строку, созданную user1.conversation_relations << relation вместо создания нового. Нужно ли мне что-то менять в моделях или неудобно?

+0

Если вы не планируете ничего делать с моделью ConversationRelation, я бы подумал об использовании ассоциации 'has_and_belongs_to_many'. Читать 2.8 [здесь] (http://guides.rubyonrails.org/association_basics.html#the-has-many-association) – Anthony

+0

'Отношение' не может принадлежать обоим пользователям – fl00r

+0

Пожалуйста, обратитесь к этому http: // stackoverflow. ком/вопросы/5218994/как к копи-много-имеет-много-через-объекты-на-на-же-времени-в рельсах. –

ответ

0

Вместо conversation.conversation_relations << relation

вы должны использовать conversation.conversation_relations.create(params)

С значения, возвращенного данной опции вы можете теперь использовать < < и новый conversation_relation будет добавлен

+0

Спасибо, это сработало для меня. – lenxn

+0

Ответьте мне правильно, пожалуйста – ppascualv

0

Вобще

user1.conversations << conversation 
# or 
conversation.users << user1 

не нужно делать РазговорRelation.new, рельсы позаботятся об этом

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