[RUBY] J'ai essayé d'implémenter des relations polymorphes à Nogizaka.

À propos des polymorphes liés

D'une manière ou d'une autre, il est difficile de s'entendre, donc après un certain temps d'étude, cela devient polymorphe ...?, J'ai donc apprécié sa mise en œuvre. Cela ressemble à un mémorandum, alors jetez un œil.

Association normale

Si vous implémentez quel groupe de pente chante quelle chanson sans définir de relations polymorphes ...

nogizaka.rb


class Nogizaka < ApplicationRecord
  has_many :songs
end

keyakizaka.rb


class Keyakizaka < ApplicationRecord
  has_many :songs
end

hinatazaka.rb


class Hinatakizaka < ApplicationRecord
  has_many :songs
end

song.rb


class Song < ApplicationRecord
  belongs_to :nogizaka
  belongs_to :keyakizaka
  belongs_to :hinatazaka
end

problème

«Si vous voulez obtenir des informations sur l'idole qui chante une certaine chanson, vous devez vérifier quelle idole chante. (Si vous êtes fan de pistes, vous comprendrez sans vérifier ... lol)

python


@song = Song.take #Obtenez une instance de manière appropriée
@song.nogizaka #Dans le cas de la chanson de Nogizaka46
@song.hinatazaka #Dans le cas de Hinatazaka 46 chansons

--46 Lorsque le nombre de groupes augmente, il est nécessaire d'ajouter une colonne au modèle de morceau.

Implémenté en polymorphe

20200620xxxx_create_songs.rb


class CreateSongs < ActiveRecord::Migration[5.2]
  def change
    create_table :songs do |t|
      t.string :name
      t.references :songable, polymorphic: true, index: true #Ici! !!
      t.timestamps
    end
  end
end

schema.rb


create_table "songs", force: :cascade do |t|
    t.string "name"
    t.string "postable_type" #Le type fait la distinction entre la classe Nogizaka et la classe Keyakizaka.
    t.integer "postable_id"
    ...(Ce qui suit est omis)
  end

Je vais également réécrire les modèles. C'est étonnamment facile.

class Nogizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Keyakizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Hinatakizaka < ApplicationRecord
  has_many :songs, as: :songable
end

class Song < ApplicationRecord
  belongs_to :songable, polymorphic: true
  # Before ↓↓↓
  # belongs_to :nogizaka
  # belongs_to :keyakizaka
  # belongs_to :hinatazaka 
  #3 lignes font maintenant 1 ligne!
end

Alors que se passe-t-il ???

# @Quand la chanson est la chanson de Nogizaka
#Association normale
@song.nogizaka # =>name:"Nogizaka 46", year_of_formation:2011,...
#Lié polymorphe
@song.songable # =>name:"Nogizaka 46", year_of_formation:2011,...

Vous pouvez aussi écrire comme ça

Définissez une méthode portant le même nom dans chaque modèle et modifiez son comportement.

class Nogizaka < ApplicationRecord
  has_many :songs, as: :songable

  def cute_member
   "Nom:#{name},Animal de compagnie:#{pet_name}"
  end
end


class Keyakizaka < ApplicationRecord
  has_many :songs, as: :songable
  
  def cute_member
   "Nom:#{name},Lieu de naissance:#{birthplace}"
  end
end


class Hinatakizaka < ApplicationRecord
  has_many :songs, as: :songable

  def cute_member
   "Nom:#{name},copie de capture:#{catch_copy}"
  end
end

résultat

python


#@Quand la chanson est Nogizaka
@song.songable.cute_member 
=> "Nom:Yuki Yoda,Animal de compagnie:Gonzo"

#@Quand la chanson est Keyakizaka
@song.songable.cute_member 
=> "Nom:Hikaru Morita,Lieu de naissance:Préfecture de Fukuoka"

#@Quand la chanson est Hinatazaka
@song.songable.cute_member 
=> "Nom:Hinano Uemura,copie de capture:Hinano!"

Résumé

Recommended Posts

J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
J'ai essayé d'implémenter la notification push Firebase en Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé d'organiser la session en Rails
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de développer une application en 2 langues
J'ai essayé de créer une compétence Alexa avec Java
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé de vérifier yum-cron
J'ai essayé la métaprogrammation avec Java
J'ai essayé de faire une demande en 3 mois d'inexpérimenté
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé de collecter et de résoudre les problèmes liés à la «classe» de Ruby.
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
J'ai créé un client RESAS-API en Java
J'ai essayé de résumer l'orientation de l'objet à ma manière.
J'ai essayé de mâcher C # (indexeur)
Essayez d'implémenter Yuma dans Ruby
J'ai essayé de résumer le support d'iOS 14
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode
J'ai essayé de mettre Domino11 dans CentOS7
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résumer l'apprentissage Java (1)
Essayez d'implémenter Yuma en Java
J'ai essayé de résumer Java 8 maintenant
C # (polymorphisme: polymorphisme)
J'ai essayé d'expliquer Active Hash
J'ai essayé de créer une application cartographique simple dans Android Studio
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
Tri des données Décroissant, croissant / Rails
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
J'ai essayé d'implémenter un mappage OU flexible avec MyBatis Dynamic SQL
J'ai essayé de faire un Numeron qui n'est pas bon avec Ruby
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé d'utiliser l'API Elasticsearch en Java
Comment implémenter la fonctionnalité de recherche dans Rails