0

UserモデルとUserMessageモデル(2人のユーザー間でプライベートメッセージを保持するためのモデル)があります

私の見解では、私は持っています。

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

しかし、私の見解では、それほど多くのコードを配置するのは正しくないようです。申し訳ありませんが、iveは非常に立ち往生しています。助けていただければ幸いです。ありがとう

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クラスで、必要な複雑なクエリを実行するという名前の2つのクラスメソッドを作成senderrecipientます。次に、ビューでこれらのメソッドを使用します。

于 2012-04-09T00:24:50.440 に答える
1

まず、関連付けを設定する必要があります。1人のユーザーが多くのメッセージを持っていて、1つのメッセージが1人のユーザーに属していると思います。

モデルに追加:

app / models / 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メッセージでfrom_idとのsender/from関係のようなものを指定することです。

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 に答える