Как лучше создать связанную таблицу, когда я создаю новую запись Model в рельсах? - PullRequest
2 голосов
/ 23 марта 2011

Я пытаюсь создать простое "потоковое" приложение для обмена сообщениями, подобное тому, которое находится в папке входящих сообщений Facebook.

У меня есть две модели: Message и UserHasMessage.

Когда создается новое сообщение,есть отправитель и получатель.Я создаю две записи в UserHasMessage, которые выглядят так:

 | user_id |  message_id  |  is_sender  |
 |sender_id|  message_id  |    1        |
 |receiver_id| message_id |    0        |

Я пытаюсь сделать это так, но не думаю, что это выглядит правильно:

16   def create
 17     @message = Message.new(params[:message])
 18     if @message.save
 19       @user_has_message = UserHasMessage.new
 20       @user_has_message.user_id = params[:sender_id]
 21       @user_has_message.message_id = @message.id
 22       @user_has_message.is_sender = 1
 23       @user_has_message.save
 24       
 25       @user_has_message = UserHasMessage.new
 26       @user_has_message.user_id = params[:receiver_id]
 27       @user_has_message.message_id = @message.id
 28       @user_has_message.is_sender = 0
 29       @user_has_message.save
 30       
 31       flash[:notice] = "Successfully created message."
 32       redirect_to @message

КСТАТИ: оба params [: receive_id] и params [: sender_id] являются скрытыми полями, передаваемыми из view / _form ... поэтому я не уверен, как это переходит в создание ...

спасибо!

1 Ответ

0 голосов
/ 24 марта 2011

То, что у вас здесь есть, выглядит хорошо, но есть несколько вариантов, чтобы очистить его.

Скорее всего, вы никогда не захотите создать сообщение без отправителя и получателя? В этом случае вы можете перегрузить новую функцию в сообщении, чтобы получить все параметры, например:

@message = Message.new(params[:message], params[:sender_id], params[:receiver_id])

А затем создайте средство проверки before_save, которое проверяет действительность идентификаторов и создает записи ассоциации.

Если вы не хотите переопределять новую функцию, вы можете также создать в сообщении функции для принятия sender_id и receive_id, например

@message = Message.new()
@message.sender_id = params[:sender_id]

И снова используйте before_save для проверки и создания записей.

Наконец, другой вариант - использовать некоторую комбинацию ассоциаций модели: has_many,: has_one,: own_to или: has_many_through, чтобы обработать все для вас. Особенно мощный, когда вы используете named_scopes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...