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

时间:2011-10-30 12:39:39

标签: ruby-on-rails ruby database ruby-on-rails-3 ruby-on-rails-3.1

我有一个问题,一次在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(@message.user_from).messages.build(params[:message])而id为2的用户也没有这个消息,只有user_id的用户有。我做错了什么?

提前致谢

3 个答案:

答案 0 :(得分:2)

使用create而不是build

如果要创建模型实例但不想立即保存,则使用

build。在您的情况下,正在创建消息实例但未保存。

答案 1 :(得分:1)

您的邮件模型应与邮件的发件人和收件人都有关联,

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(消息接收者的ID),您应该在控制器中执行以下操作,

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

答案 2 :(得分:1)

模型设计不对。怎么样:

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