将特定数据发送到集合部分

时间:2012-09-22 03:35:50

标签: ruby-on-rails-3 railstutorial.org

我有一个User课程,其中has_many :messagesMessage课程belongs_to :user。在Message控制器的show动作中有相应的视图:

<% if @messages.any? %>
  <ol class="microposts">
    <%= render partial: 'shared/message', collection: @messages %>
  </ol>
<% end %>

shared/_message.html.erb模板如下所示:

<li id="<%= message.id %>">
  <span class="content"><%= message.body %></span>
  <% user_id = message.from %>
  <% user = User.find(user_id) %>
  From: <%= user.name %>
</li>

我觉得应该在Messages控制器中完成以下两行,这是我在Rails教程中读到的:

<% user_id = message.from %>
<% user = User.find(user_id) %>

但是我如何将每条消息的相应from值(存储user.id)传递给部分?

感谢, 麦克

1 个答案:

答案 0 :(得分:3)

到目前为止,我已了解您的from表中有messages列,其中存储了user_id。因此,如果您致电message.from,则会返回user_id。然后你可以做以下

class Message < AR::Base
     belongs_to :user, :foreign_key=>'from' 
end

在您的控制器中

@messages = Message.all.includes(:user)
#It will load messages and will associated users eager loaded.

现在,在您的视图中,您可以致电message.user.name直接获取用户名。你根本不需要以下两行

<击> &lt;%user_id = message.from%&gt;
&lt;%user = User.find(user_id)%&gt;

如果我错过了什么,请告诉我。


更新

这是我尝试过的

用户模型

class User < ActiveRecord::Base
    attr_accessible :age, :name
    has_many :sent_messages,    :class_name=>'Message', :foreign_key => 'from'
    has_many :received_messages,:class_name=>'Message', :foreign_key => 'user_id'
end
#Contains Data:
#<User id: 1, name: "p1", age: 27, ... ...>, 
#<User id: 2, name: "p2", age: 25, ... ...

消息模型

class Message < ActiveRecord::Base
    attr_accessible :body, :sender, :title, :receipent
    belongs_to :sender,     :class_name => 'User', :foreign_key => 'from'
    belongs_to :receipent,  :class_name => 'User', :foreign_key => 'user_id'
end

现在说p1正在向p2

发送消息
p1.sent_messages.create(title: "test title", body: "test body", receipent: p2)
#Result:
#<Message id: 1, title: "test title", body: "test body", user_id: 2, from: 1 ... ... >

现在,对于message,您可以直接获得senderreceipent

@messages = Message.includes(:sender, :receipent) # You can load only sender or only receipent

#In View
message.sender.name 
#OR
message.receipent.name