сохранить 2 элемента в БД в 1 методе контроллера (рельсы) - PullRequest
0 голосов
/ 30 октября 2011

У меня проблема с сохранением 2 элементов в дБ за один раз (я использую рельсы 3.1). У меня есть модель Сообщение

class Message < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :content
end

Модель сообщения имеет параметры: user_id (получатель), user_from (отправитель) и контент (текст)

и модель Пользователь

class User < ActiveRecord::Base
  has_many :posts
  has_many :messages
end

в MessagesController у меня есть метод

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


  User.find(@message.user_id).messages.build(params[:message])
  User.find(@message.user_from).messages.build(params[:message])
  end

и проблема в том, что User.find (@ message.user_id) имеет только это сообщение, user_from не имеет. Я даже попробовал это User.find(2).messages.build(params[:message]) вместо User.find(@message.user_from).messages.build(params[:message]), и у пользователя с идентификатором 2 это сообщение тоже не появляется, только у пользователя с user_id. что я делаю не так ??

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Используйте create вместо build.

build используется, когда вы хотите создать экземпляр модели, но не хотите сразу его сохранить. В вашем случае экземпляры сообщений создаются, но не сохраняются.

1 голос
/ 30 октября 2011

Дизайн модели не верный.Как насчет:

class Message < ActiveRecord::Base
  belongs_to :sender, :class_name => "User"
  belongs_to :receiver, :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :sent_messages, :class_name => "Message", :foreign_key => "sender_id"
  has_many :received_messages, :class_name => "Message", :foreign_key => "receiver_id"
end

А контроллер прост (вам нужно задать params [: message] [: sender_id] и params [: message] [: receive_id] из формы):

def create
  @message = Message.create(params[:message])
  ...
end

Но вы, вероятно, не хотите, чтобы пользователь вмешивался в личность отправителя, поэтому:

def create
  @message = current_user.sent_messages.create(params[:message])
  ...
end
1 голос
/ 30 октября 2011

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

class Message < ActiveRecord::Base
  belongs_to :sender
  belongs_to :receiver
  validates_presence_of :content
end

class User < ActiveRecord::Base
  has_many :posts
  has_many :send_messages, :foreign_key => "message_from"
  has_many :received_messages, :foreign_key => "message_id"
end

Также при условии, что ваши параметры будут иметь message_id (идентификатор получателя сообщения), вы должны сделать следующее в вашем контроллере,

@message = current_user.send_messages.build(params[:message])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...