Oft auf Websites mit Frima-Elementen wie Mercari und Jimoty Abgesehen von der Liste der Transaktionen, die ich auf meiner Seite aufgelistet habe Die "Liste der laufenden Transaktionen" wird häufig angezeigt, nicht wahr?
Es ist also ziemlich mühsam, jede Transaktion mit einem Lesezeichen zu versehen Ist es nicht eine nützliche Funktion?
Heute möchte ich es implementieren, um es zu ermöglichen.
Wie im Beispiel ist der Artikel (Transaktion) ein Artikel und der Kommentar (Austausch) ein Kommentar. Jedes Modell sollte wie oben zugeordnet werden.
user.rb
has_many :articles
has_many :comments
article.rb
belongs_to :user
has_many :comments
comment.rb
belongs_to :user
belongs_to :article
application_controller.rb
helper_method :current_user
private
def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
Angenommen, es gibt eine Hilfsmethode "current_user", die den angemeldeten Benutzer wie oben beschrieben zurückgibt.
Holen Sie sich die Artikel, die Sie zu folgendem @ article_commented_on
kommentiert haben.
home_controller.rb
def mypage
@article_commented_on = current_user.messages.includes(:article).map(&:article).uniq
end
Holen Sie sich alle vom Benutzer geposteten Kommentare mit current_user.messages
Verwenden Sie "include (: article)", um eine Tabelle mit einem Artikel zu verknüpfen.
Geben Sie dann mit map (&: article)
nur den Artikel an das neu extrahierte Array zurück.
Führen Sie uniq
(eine Methode eines Arrays, die keine Methode zum Abfragen ist) aus, um Duplikate zu entfernen.
Auf diese Weise konnte ich nur die Artikel erhalten, die ich in @ article_commented_on
kommentiert hatte.
Durch Ausführen einer Tabellenverknüpfung mit "include (: article)" Sie können den Zugriff auf die Datenbank minimieren, der jedes Mal auftritt, wenn Sie den Artikel erhalten, der jeder Nachricht entspricht.
Das ist alles, danke für deine harte Arbeit!
Recommended Posts