2017-05-21 2 views
0

J'ai été à la recherche sur les rubis sur l'héritage des rails, mais tout ce que je pouvais trouver est l'héritage où il n'y a pas de nouveaux attributs, comme ceci:L'héritage Ruby on Rails avec de nouveaux attributs?

class Animal < ActiveRecord::Base; end 
class Dog < Animal; end 
class Cat < Animal; end 

et l'ajout d'un nouveau champ de type à la table

class CreateAnimals < ActiveRecord::Migration 
    def self.up 
    create_table :animals do |t| 
     t.string :name 
     t.string :race 
     t.string :type 
    end 
    end 
end 

Mais comment ajouter un nouvel attribut à Dog, par exemple? Comme, les chiens ont un 'nom' et une 'race' héritée d'Animal, mais comment ajouter 'bark_type', que seul un chien a?

Répondre

3

Je crois que ce que vous cherchez est l'héritage à table unique (STI). Fondamentalement vous avez une seule table dans la base de données appelée Pets qui a tous les attributs requis (y compris ceux pour les sous-classes) et vous avez une colonne "type" qui devrait être non-null et c'est la colonne dans laquelle vous stockez la sous-classe "

il est un bel exemple qui a un animal de compagnie, les chiens et les chats par exemple here

exemple

DogsController < ApplicationController

def new 
    @dog = Dog.new 
    end 

    def create 
    @dog = Dog.new(dog_params) 
    if @dog.save 
    ... 
    end 
    end 

private 

    def dog_params 
    params.require(:dog).permit(:name, :age) 
    end 
end 

Important

En appelant Dog.new au lieu de Pet.new est comme dire à activerecord c'est un nouveau record pour la table Pet et dans la colonne intitulée « type » ajouter la chaîne « chien »

Note 2: Si pour le modèle de chats que vous ne veut pas enregistrer: paramètre d'âge, vous n'avez tout simplement pas de champ d'âge dans votre formulaire. MAIS parce que pour les chiens vous voulez aussi l'âge, la table Pets devrait avoir une colonne d'âge qui sera utilisée par le modèle Dog

+0

oui, c'est STI, je ne suis pas sûr de savoir comment le faire sur les rails. Je voudrais avoir un contrôleur pour chien et un pour chat qui sauve sur la table des animaux de compagnie? comment ferais-je cela? l'exemple que vous avez lié n'a aucun nouvel attribut sur les classes de chat/chien – xSlok

+0

Veuillez lire le lien que j'ai fourni avec soin. Comme je l'ai dit, tous les attributs de chat ou de chien doivent être des colonnes sur la table des animaux de compagnie. La colonne type de la table Pet aura la sous-classe par exemple "dog". Je vais mettre à jour ma réponse avec un petit exemple –