2011-03-23 51 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

相關問題