在1控制器方法(rails)中保存db中的2项

我有一个问题,一次在db中保存2个项目(我正在使用rails 3.1)。 我有模型消息

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

消息模型有params: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(2).messages.build(params[:message])而不是User.find(@message.user_from).messages.build(params[:message])和id为2的用户也有这个消息,只有user_id的用户有。 我做错了什么?

提前致谢

使用create而不是build

如果要创建模型实例但不想立即保存,则使用build 。 在您的情况下,正在创建消息实例但未保存。

您的消息模型应该与消息的发送者和接收者都有关联,

 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 

假设你的params将有message_id(消息接收者的id),你应该在你的控制器中执行以下操作,

 @message = current_user.send_messages.build(params[:message]) 

模型设计不对。 怎么样:

 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] [:receiver_id]从表单中设置):

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

但您可能不希望用户篡改发件人身份,因此:

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