0

我有一个 User 模型和一个 UserMessage 模型(用于保存两个用户之间的私人消息的模型)

在我看来我有..

<% 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中找到用户对象。那是对的吗?

但我真正想要的是来自 from_id 的用户(发送消息的人)。有没有办法找回它?我知道做类似的事情.. message_item.user.from_id 不起作用。

我能想到的唯一方法就是做

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

但这在我看来似乎不正确。抱歉,我被卡住了。帮助将不胜感激。谢谢

4

4 回答 4

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
于 2012-04-09T00:47:22.733 回答
1

尝试这个:

在您的 UserMessage 类中,创建两个名为senderrecipient执行您想要的复杂查询的类方法。然后在您的视图中使用这些方法。

于 2012-04-09T00:24:50.440 回答
1

首先,您需要设置关联。我猜一个用户有很多消息,一个消息属于一个用户。

添加到模型:

应用程序/模型/user.rb

has_many :user_messages

*app/models/user_messages.rb*

belongs_to :user

您可能需要在 user_messages 表中添加一列,称为user_id

当您在控制器中获取消息时,告诉 rails 立即加载关联的用户,因此 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
于 2012-04-09T00:24:56.863 回答
1

我认为您正在为模型中的 belongs_to 寻找 foreign_key 选项。因此,您需要在 UserMessage 消息中指定类似于 sender/from 与 from_id 的关系

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

然后在模板中,您只需在视图中调用此关系。

message_item.sender

它应该与message_item.user.

如需进一步参考,请访问协会文档

另外我建议你不要.name在模板中调用方法,而是在你的模型中指定 to_s 方法。klump 在他的回答中指出的好方法是使用.include方法来获得更好的性能。它将在加载数据时加载用户数据UserMessage,而不是在另一个查询中。

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

代码来自另一个答案——Rails ActiveRecord:是否可以组合 :include 和 :conditions 查询?

于 2012-04-09T00:26:04.397 回答