La mise en œuvre de Base Abstraite de la Classe du Modèle, les Rails de Chemin™
J'ai un Livre et Télécharger modèle que partagent de nombreux attributs, donc mon but est d'hériter de la commune attributs à partir d'un DownloadableResource modèle.
Eu un coup d'oeil à IST, mais je suis allé le abstrait modèle de base de la classe plutôt:
- modèles:
class DownloadableResource < ActiveRecord::Base self.abstract_class = true attr_accessible :title, :url, :description, :active, :position validates :title, :url, :description, presence: true scope :active, where(active: true).order(:position) end class Book < DownloadableResource attr_accessible :cover_url, :authors validates :cover_url, :authors, presence: true end class Download < DownloadableResource attr_accessible :icon_url validates :icon_url, presence: true end
- migrations:
class CreateDownloadableResources < ActiveRecord::Migration def change create_table :downloadable_resources do |t| t.string :title t.string :url t.text :description t.boolean :active, default: false t.integer :position t.timestamps end end end class CreateBooks < ActiveRecord::Migration def change create_table :books do |t| t.string :cover_url t.string :authors t.timestamps end end end class CreateDownloads < ActiveRecord::Migration def change create_table :downloads do |t| t.string :icon_url t.timestamps end end end
Après la migration, quand je crée un nouveau Livre le résultat est loin d'être prévu:
> Book.new
=> #<Book id: nil, cover_url: nil, authors: nil, created_at: nil, updated_at: nil>
Quelqu'un peut-il s'il vous plaît faire la lumière sur la façon d'appliquer la Base Abstraite de la Classe du Modèle technique ActiveRecord modèles peuvent partager le code commun via l'héritage encore être persisté à différentes tables de base de données?
Une façon est d'une composition à la place de l'héritage. Quelques exemple: rails-bestpractices.com/posts/17-extract-into-module
Comme une note de côté, même si vous allez avec deux structurée de la même manière des tableaux, vous pouvez au moins garder votre migrations SEC en créant d'abord toutes les tables avec seulement leurs champs uniques et ensuite de faire quelque chose comme
Comme une note de côté, même si vous allez avec deux structurée de la même manière des tableaux, vous pouvez au moins garder votre migrations SEC en créant d'abord toutes les tables avec seulement leurs champs uniques et ensuite de faire quelque chose comme
[:books, :downloads].each do |table| change_table table do |t| t.text :description # ... end end
OriginalL'auteur Marius Butuc | 2012-12-30
Vous devez vous connecter pour publier un commentaire.
Par la déclaration d'un modèle abstrait vous êtes en train de dire qu'il n'y a pas de table sous-jacente et que vous voulez autoriser le sous-classement. Que signifie:
downloadable_resources
tablebooks
au lieu dedownloadable_resources
@Finbarr déjà mentionné, cela signifie aussi que les deux
Book
etDownload
, les modèles ont besoin d'avoir tous les attributs dans leurs tableaux.Qu'est-ce que cela est réellement utile pour alors? À mon avis pas pour autant. Vous pouvez partager des validations, des lunettes etc. mais vous pouvez obtenir tout cela plus facilement en incluant des modules personnalisés.
Pour résoudre votre problème, je serais probablement aller avec une approche différente. Je voudrais créer un autre modèle appelé
DownloadableContent
qui serait autonome. Il comprendrait des validations et le tableau aurait tous les attributs. Et enfin les modèlesBook
etDownload
aurait polymorphehas_one
rapport à laDownloadableContent
modèle.Vous pourriez aller avec les STI approche, mais en général, je n'aime pas le mélange de tous les attributs personnalisés de l'ensemble.
OriginalL'auteur Jiří Pospíšil
Il ne devrait pas être un
downloadable_resources
table dans ce cas. Vos deux livres et télécharge les tableaux doivent déclarer tous les domaines dont ils ont besoin.OriginalL'auteur Finbarr