Ruby on rails 在rails中创建模型的新记录时,创建相关表的更好方法是什么?

Ruby on rails 在rails中创建模型的新记录时,创建相关表的更好方法是什么?,ruby-on-rails,Ruby On Rails,我正在尝试创建一个简单的消息“线程”应用程序,就像在Facebook收件箱中找到的那样 我有两个模型:Message和UserHasMessage 创建新消息时,有一个发送者和一个接收者。我要做的是在UserHasMessage中创建两条记录,如下所示: | user_id | message_id | is_sender | |sender_id| message_id | 1 | |receiver_id| message_id | 0

我正在尝试创建一个简单的消息“线程”应用程序,就像在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
顺便说一句:参数[:receiver\u id]和参数[:sender\u id]都是从视图/表单传递的隐藏字段。。。所以我不确定它是如何流入create


谢谢

这里的东西看起来不错,但是有一些选项可以清理

最有可能的情况是,如果没有发送者和接收者,您永远不会想要创建一条消息?在这种情况下,您可以在消息上重载新函数以获取所有参数,如:

@message = Message.new(params[:message], params[:sender_id], params[:receiver_id])
然后创建一个before_save验证器,用于检查ID的有效性并创建关联记录

如果不想覆盖新函数,还可以在消息上创建函数以接受发送者id和接收者id,如

@message = Message.new()
@message.sender_id = params[:sender_id]
然后再次使用“保存前”来验证和创建记录


最后,另一种选择是通过模型关联使用:has_many、:has_one、:belient_to或:has_many_的组合来为您处理一切。当您使用命名的作用域时,它的功能尤其强大。

这里的功能看起来不错,但是有一些选项可以清理它

最有可能的情况是,如果没有发送者和接收者,您永远不会想要创建一条消息?在这种情况下,您可以在消息上重载新函数以获取所有参数,如:

@message = Message.new(params[:message], params[:sender_id], params[:receiver_id])
然后创建一个before_save验证器,用于检查ID的有效性并创建关联记录

如果不想覆盖新函数,还可以在消息上创建函数以接受发送者id和接收者id,如

@message = Message.new()
@message.sender_id = params[:sender_id]
然后再次使用“保存前”来验证和创建记录


最后,另一种选择是通过模型关联使用:has_many、:has_one、:belient_to或:has_many_的组合来为您处理一切。当您使用命名范围时尤其强大。

如何执行后一个建议。即使消息本身没有sender_id或receiver_id的属性,第一个建议是否有效(必须存储在关联UserHasMessages中)。您可以在模型上定义新方法和属性,并使用这些方法执行直接存储在数据库中的字段以外的操作。通过声明“def sender_id=(myid))“然后,您可以如上所述调用该函数。对于后一种情况,此处提供了有关模型关联的教程。如何执行后一个建议。即使消息本身没有发件人id或收件人id的属性,第一个建议是否有效?”(这必须存储在关联UserHasMessages中。您可以在模型上定义新方法和属性,并使用这些方法执行直接在数据库中存储字段以外的操作。通过声明“def sender_id=(myid)”然后,您可以如上所述调用该函数。对于后一种情况,此处提供了有关模型关联的教程。