[RUBY] Ich habe versucht, polymorph in Nogizaka zu implementieren.

Über polymorph verwandt

Irgendwie ist es schwer damit auszukommen, also wird es nach einer Weile des Studiums polymorph ...? Also habe ich es genossen, es zu implementieren. Es fühlt sich wie ein Memorandum an, also schauen Sie bitte.

Normale Assoziation

Wenn Sie implementieren, welche Hanggruppe welches Lied singt, ohne polymorphe Beziehungen zu definieren ...

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

Problem

――Wenn Sie Informationen über das Idol erhalten möchten, das ein bestimmtes Lied singt, müssen Sie überprüfen, welches Idol singt. (Wenn Sie ein Fan von Pisten sind, werden Sie verstehen, ohne zu überprüfen ... lol)

python


@song = Song.take #Holen Sie sich eine Instanz entsprechend
@song.nogizaka #Im Fall von Nogizaka46s Lied
@song.hinatazaka #Im Fall von Hinatazaka 46 Songs

--46 Wenn die Anzahl der Gruppen zunimmt, muss dem Songmodell eine Spalte hinzugefügt werden.

In polymorph implementiert

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 #Hier! !!
      t.timestamps
    end
  end
end

schema.rb


create_table "songs", force: :cascade do |t|
    t.string "name"
    t.string "postable_type" #Der Typ unterscheidet zwischen der Nogizaka-Klasse und der Keyakizaka-Klasse.
    t.integer "postable_id"
    ...(Folgendes wird weggelassen)
  end

Ich werde die Modelle auch umschreiben. Es ist überraschend einfach.

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 Zeilen sind jetzt 1 Zeile!
end

Also was passiert ???

# @Wenn das Lied Nogizakas Lied ist
#Normale Assoziation
@song.nogizaka # =>name:"Nogizaka 46", year_of_formation:2011,...
#Polymorph verwandt
@song.songable # =>name:"Nogizaka 46", year_of_formation:2011,...

Sie können auch so schreiben

Definieren Sie in jedem Modell eine Methode mit demselben Namen und ändern Sie das Verhalten darin.

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

  def cute_member
   "Name:#{name},Haustier:#{pet_name}"
  end
end


class Keyakizaka < ApplicationRecord
  has_many :songs, as: :songable
  
  def cute_member
   "Name:#{name},Geburtsort:#{birthplace}"
  end
end


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

  def cute_member
   "Name:#{name},Kopie fangen:#{catch_copy}"
  end
end

Ergebnis

python


#@Wenn das Lied Nogizaka ist
@song.songable.cute_member 
=> "Name:Yuki Yoda,Haustier:Gonzo"

#@Wenn das Lied Keyakizaka ist
@song.songable.cute_member 
=> "Name:Hikaru Morita,Geburtsort:Präfektur Fukuoka"

#@Wenn das Lied Hinatazaka ist
@song.songable.cute_member 
=> "Name:Hinano Uemura,Kopie fangen:Hinano!"

Zusammenfassung

Recommended Posts

Ich habe versucht, polymorph in Nogizaka zu implementieren.
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, innerhalb von 3 Monaten einen Antrag von unerfahren zu stellen
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, Rubys "Klassen" -Probleme zu sammeln und zu lösen.
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe versucht, die Objektorientierung auf meine Weise zusammenzufassen.
Ich habe versucht, C # (Indexer) zu kauen.
Versuchen Sie, Yuma in Ruby zu implementieren
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären
Ich habe versucht, Domino11 in CentOS7 zu integrieren
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Versuchen Sie, Yuma in Java zu implementieren
Ich habe jetzt versucht, Java 8 zusammenzufassen
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, Active Hash zu erklären
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Daten sortieren Absteigend, aufsteigend / Schienen
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Ich habe versucht, eine flexible ODER-Zuordnung mit MyBatis Dynamic SQL zu implementieren
Ich habe versucht, einen Numeron zu erstellen, der mit Ruby nicht gut ist
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
So implementieren Sie Suchfunktionen in Rails