0

Userクラスがありhas_many :messagesます。コントローラのshowアクションには、対応するビューがあります。Messagebelongs_to :userMessage

<% 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>

MessagesRailsのチュートリアルで読んだ内容から、コントローラーで次の2行を実行する必要があるように感じます。

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

しかし、各メッセージの対応するfrom値(user.idを格納する)をパーシャルに渡すにはどうすればよいですか?

ありがとう、マイク

4

1 に答える 1

3

これまでのところ、テーブルに を格納するfrom列があることを理解しました。したがって、呼び出すと、. 次に、次のことができますmessagesuser_idmessage.fromuser_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ビューで、ユーザーの名前を直接取得するために呼び出すことができます。ビューにこれらの次の2行はまったく必要ありません

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

何か見逃した場合はお知らせください。


アップデート:

これが私が試したものです

ユーザーモデル

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
于 2012-09-22T03:46:58.527 に答える