2012-04-09 47 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

相关问题