[RAILS] Comment obtenir uniquement les articles et les transactions que vous avez commentés ou envoyés par message [comprend]

introduction

Souvent sur des sites avec des éléments frima tels que Mercari et Jimoty En dehors de la liste des transactions que j'ai répertoriées sur Ma page La «liste des transactions en cours» est souvent affichée, n'est-ce pas?

Il est assez difficile de mettre en signet chaque transaction, donc N'est-ce pas une fonction utile?

Aujourd'hui, je voudrais le mettre en œuvre pour y arriver.

Relation entre les modèles

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

Comme dans l'exemple, l'article (transaction) est un article et le commentaire (échange) est un commentaire. Chaque modèle doit être associé comme ci-dessus.

user.rb


  has_many :articles
  has_many :comments

article.rb


  belongs_to :user
  has_many :comments

comment.rb


  belongs_to :user
  belongs_to :article

Acquisition d'articles (transactions)

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

En supposant qu'il existe une méthode d'assistance utilisateur_actuel qui renvoie l'utilisateur connecté comme décrit ci-dessus, Obtenez les articles que vous avez commentés sur @ article_commented_on.

home_controller.rb


  def mypage
    @article_commented_on = current_user.messages.includes(:article).map(&:article).uniq
  end

Obtenez tous les commentaires publiés par l'utilisateur avec current_user.messages Utilisez includes (: article) pour joindre une table avec un article.

Ensuite, utilisez map (&: article) pour renvoyer uniquement l'article vers le nouveau tableau extrait. Exécutez uniq (une méthode d'un tableau qui n'est pas une méthode d'interrogation) pour éliminer les doublons.

En faisant cela, j'ai pu obtenir uniquement les articles que j'avais commentés dans @ article_commented_on.

En faisant une jointure de table avec includes (: article) Vous pouvez minimiser l'accès à la base de données qui se produit chaque fois que vous obtenez l'article correspondant à chaque message.

C'est tout, merci pour votre travail acharné!

Recommended Posts

Comment obtenir uniquement les articles et les transactions que vous avez commentés ou envoyés par message [comprend]
Comment obtenir et étudier Java SE8 Gold
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
[Kotlin] Comment obtenir l'adresse IP et l'agent utilisateur
[Swift5] Comment analyser un JSON complexe et obtenir l'index de l'élément qui satisfait la condition
Comment remplacer des caractères que vous ne comprenez pas [Principe]
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
Comment exécuter JUnit par lots et obtenir une couverture