[RAILS] So erhalten Sie nur Artikel und Transaktionen, die Sie kommentiert oder mit Nachrichten versehen haben [enthält]

Einführung

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.

Beziehung zwischen Modellen

スクリーンショット 2020-11-06 20.06.54.png

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

Erwerb von Artikeln (Transaktionen)

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

So erhalten Sie nur Artikel und Transaktionen, die Sie kommentiert oder mit Nachrichten versehen haben [enthält]
Wie man Java SE8 Gold bekommt und studiert
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
[Kotlin] So erhalten Sie die IP-Adresse und den Benutzeragenten
[Swift5] Wie man komplexes JSON analysiert und den Index des Elements erhält, das die Bedingung erfüllt
So ersetzen Sie Zeichen, die Sie nicht verstehen [Prinzip]
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
So führen Sie JUnit im Batch aus und erhalten Abdeckung