在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