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.
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
――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.
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
# @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,...
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
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!"
@ song.songable
erhalten. (Es ist schwer, sich ein Bild zu machen, und ich denke, es ist hier, was die Polymorphie schwierig macht.)
»Idole sind doch süß. .. ..Recommended Posts