2012-04-09 25 views
0

我有一個用戶模型和UserMessage模型這個rails調用如何從一個id獲取一個對象?

在我看來

我有(舉辦兩個用戶的私人信息模型)..

<% if @message_items.any? %> 
    <ol class="messages"> 
     <%= render partial: 'message_item', collection: @message_items%> 
    </ol> 
    <%= will_paginate @message_items %> 
<% end %> 

我與渲染...

<li id="<%= message_item.id %>"> 
    <span class="user"> 
     <%= link_to message_item.user.name, message_item.user %> 
    </span> 
    <span> 
     <%= message_item.title %> 
    </span> 
    <span> 
     <%= message_item.body %> 
    </span> 
</li> 

UserMessage(它來自message_item)如何能夠呈現User對象?我的UserMessage設計只有以下屬性「id,user_id,from_id,title,body,created_at,updated_at」。

我猜想它來自user_id,並且rails以某種方式建立連接,並能夠從user_id中找到User對象。那是對的嗎?

但我真正想要的,但是,從from_id(發送消息的人)的用戶。有沒有辦法檢索?我知道做類似.. message_item.user.from_id不起作用。

我能想到的唯一可行的辦法就是通過做

<%= User.find(id= message_item.from_id).name %> 

,但似乎並不正確把這麼多的代碼在我的視野。抱歉,但我一直超級卡住。幫助將不勝感激。感謝

+0

因爲消息有用戶。不知道如何定義消息類,就很難告訴你如何檢索「from」用戶;如果它是一個正常的Rails關聯,它可能只是「message.from」。 – 2012-04-09 00:13:58

+0

哦謝謝洞察力=) – Sasha 2012-04-09 00:49:51

回答

1

我認爲你正在尋找belongs_to的foreign_key選項在模型中。所以,你需要的是指定UserMessage消息

belongs_to :sender, foreign_key: :from_id, class_name: "User" 

像發送/從from_id關係然後在模板只需調用鑑於這種關係。

message_item.sender 

它應該與message_item.user一樣工作。

更多參考訪問documentation for associations

此外,我建議你不要調用模板.name的方法,但指定to_s模型中的方法。 klump在他的回答中指出的好方法是使用.include方法獲得更好的性能。它將在加載UserMessage數據時加載用戶數據,而不是在另一個查詢中。

Article.find :all, :include => :revisions 

代碼從另一個答案衍生 - Rails ActiveRecord: Is a combined :include and :conditions query possible?

+0

是否有可能將UserMessage關聯到2個用戶?我在想這樣的事情: 'belongs_to:sender,foreign_key :: from_id,class_name:「User」' 'belongs_to:recipient,foreign_key :: to_id,class_name:「User」 這將結合非常多這裏的想法。 – klump 2012-04-09 00:30:25

+0

是的,你可以。幾乎完全是你寫的。除了約定之外,您還應該將其中一個用戶設置爲擁有者角色,因此「some_to」這個消息是「某人」。 – Mailo 2012-04-09 00:39:15

+0

非常感謝您的幫助!這是非常有益的! – Sasha 2012-04-09 00:48:59

1

試試這個:

在你UserMessage類,使名爲senderrecipient兩類方法執行所需的複雜的查詢。然後在你的視圖中使用這些方法。

+0

好主意,可能比我的答案更有用... – klump 2012-04-09 00:26:52

+1

我很確定,這種方法應該通過命名範圍來實現 - http://railscasts.com/episodes/108-命名範圍 – Mailo 2012-04-09 00:47:23

+0

命名示波器聽起來更像軌道方式。 – iGbanam 2012-04-10 16:28:46

1

首先你需要設置關聯。我猜一個用戶有很多消息,一條消息屬於一個用戶。

添加到模型:

應用程序/模型/ user.rb

has_many :user_messages 

*應用程序/模型/ user_messages.rb *

belongs_to :user 

您可能需要添加列到您的user_messages表中,名爲user_id

當您獲取在控制器中的消息,告訴Rails加載相關的用戶權限了,所以不必須軌道做到這一點以後:

@message_items = UserMessage.includes(:user).all 

現在,您可以訪問用戶對象「擁有」的消息真的易:

<%= message_item.user.name %> 

如果需要用戶擁有的所有信息這也是現在很容易:

@user = User.find(some_id) 
@user.messages # this returns an array with all the message objects 
+0

'.include'是我錯過的好方法;) – Mailo 2012-04-09 00:27:48

+0

非常感謝您的幫助!我非常感激=) – Sasha 2012-04-09 00:49:14

3

您需要以下車型

class User < ActiveRecord::Base 
    has_many :received_user_messages, 
      :class_name => "UserMessage", :foreign_key => :receiver_id 

    has_many :sent_user_messages, :class_name => "UserMessage", 
      :class_name => "UserMessage", :foreign_key => :sender_id 
end 

class UserMessage < ActiveRecord::Base 

    # should have sender_id and receiver_id columns 
    # make sure you index these columns 

    belongs_to :sender, :class_name => "User" 
    belongs_to :receiver, :class_name => "User" 

end 

執行以下列出由一個用戶收到消息:

current_user.received_messages(:include => :sender).each do |message| 
    p "[#{message.sender.name}]: #{message.content}" 
end 

執行以下操作,以列出消息由用戶發送

current_user.sent_messages(:include => :receiver).each do |message| 
    p "[#{message.receiver.name}]: #{message.content}" 
end 
+0

整潔!我會牢記這一點。謝謝! – Sasha 2012-04-09 00:50:36

+0

我同意聯合..部分 – Mailo 2012-04-09 00:50:39

+0

非常有趣你現在寫的東西,即時通訊考慮它更多=)非常感謝 – Sasha 2012-04-09 00:55:06