2012-04-09 1 views
0

ich habe ein User-Modell und ein UserMessage Modell (ein Modell für die privaten Nachrichten zwischen zwei Benutzern halten)Wie ruft diese Schiene ein Objekt von nur einer ID ab?

meiner Meinung nach habe ich ..

<% if @message_items.any? %> 
    <ol class="messages"> 
     <%= render partial: 'message_item', collection: @message_items%> 
    </ol> 
    <%= will_paginate @message_items %> 
<% end %> 

, die ich mit ... machen

Wie kann das Objekt UserMessage (das von message_item stammt) das User-Objekt rendern? Mein Entwurf für die UserMessage hat nur die folgenden Attribute "ID, Benutzer-ID, from_id, title, body, created_at, updated_at".

Ich denke, es ist von der Benutzer-ID, und Schienen irgendwie die Verbindung und ist in der Lage, das Benutzerobjekt von der Benutzer-ID zu finden. Ist das korrekt?

aber ich, was ich wirklich will, ist der Benutzer von der from_id (die Person, die die Nachricht sendet). Gibt es eine Möglichkeit, das herauszufinden? Ich weiß, etwas wie .. message_item.user.from_id funktioniert nicht.

der einzige Weg, ich das funktioniert denken könnte, ist durch

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

aber das scheint nicht richtig, so viel Code in meiner Ansicht nach setzen. Entschuldigung, aber ich war schon sehr fest. Hilfe würde sehr geschätzt werden. Dank

+0

Da eine Nachricht einen Benutzer hat. Ohne zu wissen, wie die Nachrichtenklasse definiert ist, ist es schwieriger, Ihnen zu sagen, wie Sie den "Von" -Benutzer abrufen können. Wenn es sich um eine normale Rails-Verbindung handelt, könnte es sich einfach um "message.from" handeln. –

+0

oh danke für die Einsicht =) – Sasha

Antwort

1

ich glaube, Sie für belongs_to für foreign_key Option suchen im Modell.Also, was Sie brauchen, ist etwas wie Absender an,/aus der Beziehung mit from_id in UserMessage Nachricht

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

Dann in Vorlage rufen Sie gerade diese Beziehung in Aussicht.

message_item.sender 

Es sollte als message_item.user gleiche Arbeit.

Weitere Referenzbesuch documentation for associations

Außerdem empfehle ich Ihnen .name Methode in Vorlage nicht nennen, aber to_s Methode in Ihrem Modell angeben. Eine gute Vorgehensweise, auf die klump in seiner Antwort hinweist, ist die Verwendung der Methode .include für eine bessere Leistung. Es lädt Benutzerdaten beim Laden UserMessage Daten, nicht in einer anderen Abfrage.

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

Code wurde von einer anderen Antwort abgeleitet - Rails ActiveRecord: Is a combined :include and :conditions query possible?

+0

Wäre es möglich, eine UserMessage mit 2 Benutzern zu verbinden? Ich denke an etwas in der Art: 'gehört_zu: Absender, Foreign_key:: from_id, Klassenname:" User "' 'gehört zu: Empfänger, Foreign_key:: to_id, Klassenname:" User "' Dies würde ziemlich viel kombinieren die Ideen hier. – klump

+0

Ja, Sie können. Fast genau so wie du geschrieben hast. Zusammen mit Konventionen sollten Sie einen der Benutzer in die Rolle des Eigentümers setzen, also die Nachricht "' gehört_zu' "jemandem. – Mailo

+0

vielen dank für ihre hilfe! es war sehr hilfreich! – Sasha

1

Versuchen Sie folgendes:

In Ihrem UserMessage Klasse, zwei Klassenmethoden sender und recipient, die die komplexen Abfragen, die Sie wollen durchführen benannt machen. Dann verwenden Sie diese Methoden aus Ihrer Sicht.

+0

Gute Idee, wahrscheinlich nützlicher als meine Antwort ... – klump

+1

Ich bin mir ziemlich sicher, diese Art von Methode sollte durch benannte Bereiche implementiert werden - http://railscasts.com/episodes/108- named-scope – Mailo

+0

Benannte Bereiche klingt mehr wie die Schienen Weg. – iGbanam

1

Zuerst müssen Sie die Zuordnungen festlegen. Ich denke, dass ein Benutzer viele Nachrichten hat und eine Nachricht zu einem Benutzer gehört.

zu den Modellen hinzufügen:

app/models/user.rb

has_many :user_messages 

* app/models/user_messages.rb *

belongs_to :user 

Möglicherweise müssen hinzufügen eine Spalte zu Ihrer Tabelle user_messages mit der Bezeichnung user_id

Wenn Sie die Nachrichten in der Steuerung holen, Schienen sagen die zugehörigen Benutzer sofort zu laden, so Schienen müssen nicht diese später zu tun haben:

@message_items = UserMessage.includes(:user).all 

Jetzt können Sie das Benutzerobjekt „besitzen“ die Nachricht zugreifen wirklich einfach:

<%= message_item.user.name %> 

Wenn Sie alle Nachrichten von einem Benutzer, das ist einfach jetzt auch im Besitz benötigen:

@user = User.find(some_id) 
@user.messages # this returns an array with all the message objects 
+0

Das '.include' ist eine gute Annäherung, die ich verpasste;) – Mailo

+0

vielen Dank für Ihre Hilfe! Ich schätze es sehr =) – Sasha

3

Sie benötigen folgende Modelle

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 

die folgenden Möglichkeiten, die Nachrichten zur Liste durch einen einem Benutzer empfangen:

current_user.received_messages(:include => :sender).each do |message| 
    p "[#{message.sender.name}]: #{message.content}" 
end 

Folgendes tun, um Die Nachrichten durch einen einen Benutzer gesendet:

current_user.sent_messages(:include => :receiver).each do |message| 
    p "[#{message.receiver.name}]: #{message.content}" 
end 
+0

ordentlich! Ich werde dies im Hinterkopf behalten. Danke! – Sasha

+0

stimme ich mit dem assozi .. Teil – Mailo

+0

sehr interessant, was Sie jetzt geschrieben haben, dass ich darüber nachdenken mehr =) vielen Dank – Sasha

Verwandte Themen