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.
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
«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.
polymorphic: true
sur references
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
# @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,...
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
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!"
@ song.songable
. (Il est difficile d'obtenir une image, et je pense que c'est ici que le polymorphisme est difficile.)
――Les idoles sont mignonnes après tout. .. ..Recommended Posts