Ruby on rails 在rails中创建模型的新记录时,创建相关表的更好方法是什么?
我正在尝试创建一个简单的消息“线程”应用程序,就像在Facebook收件箱中找到的那样 我有两个模型:Message和UserHasMessage 创建新消息时,有一个发送者和一个接收者。我要做的是在UserHasMessage中创建两条记录,如下所示: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
| 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)”然后,您可以如上所述调用该函数。对于后一种情况,此处提供了有关模型关联的教程。