2011-03-23 55 views
2

我想创建一个简单的消息“线程”应用程序,如在Facebook收件箱中找到。当我在rails中创建Model的新记录时,创建相关表的更好方法是什么?

我有两个模型: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 

BTW:未参数[:receiver_id]和params [:sender_id]是从视图/ _form传递的hidden_​​fields ...所以我不知道它如何流入创建...

谢谢!

回答

0

你在这里看起来很好,但有一些选项可以清理它。

很有可能你永远不想创建一个没有发送者和接收者的消息?在这种情况下,你可以重载新功能的消息,采取各种参数,如:

@message = Message.new(params[:message], params[:sender_id], params[:receiver_id]) 

,然后创建一个before_save验证,检查ID的有效性,并创建关联的记录。

如果你不希望重写新功能,你也可以在消息中创建函数接受SENDER_ID和receiver_id,像

@message = Message.new() 
@message.sender_id = params[:sender_id] 

,然后再次使用before_save验证和创建记录。

最后,另一种选择是使用:has_many,:has_one,:belongs_to或has_many_through模型关联的某种组合来处理您的所有事情。当您使用named_scopes时尤其强大。

+0

我该怎么做后一个建议。即使消息本身没有sender_id或receiver_id的属性,第一个建议是否也能工作(这必须存储在关联UserHasMessages中。 – Angela 2011-03-24 18:00:06

+0

)您可以在模型上定义新的方法和属性,并使用这些方法执行其他操作通过声明“def sender_id =(myid)”,你可以像上面描述的那样调用该函数,对于后一种情况,模型关联教程可以在这里找到.http://guides.rubyonrails。组织/ association_basics.html – Joshua 2011-03-25 21:35:41