2010-01-14 7 views
2

J'ai laHéritage de table unique: toutes les classes de la hiérarchie doivent-elles avoir les mêmes propriétés?

suivante
class Item < ActiveRecord::Base 
end 

class Talk < Item 
end 

avec la migration

class CreateItems < ActiveRecord::Migration 
    def self.up 
    create_table :items do |t| 
     t.string :type 
     t.string :name 
     t.text :description 
     t.time :start_time 
     t.time :duration 
     t.timestamps 
    end 
    end 

    ... 
end 

Par défaut, la propriété de description sera disponible sur les classes d'article et Talk. Existe-t-il un moyen de restreindre la propriété afin qu'elle ne soit disponible que pour la classe Talk?

Répondre

2
class Item < ActiveRecord::Base 
    def duration 
    raise NoMethodError 
    end 

    def duration=(value) 
    raise NoMethodError 
    end 
end 

class Talk < Item 
    def duration 
    read_attribute(:duration) 
    end 

    def duration=(value) 
    write_attribute(:duration, value) 
    end 
end 

Vous pouvez toujours faire cela, mais c'est beaucoup de travail pour rien. Quel est le pire qui se produira lorsque vous lisez la durée sur un objet? Vous reviendrez à zéro, ce qui causera un accident peu de temps après. Vous n'avez pas besoin d'être si préoccupé par ces types de problèmes dans Ruby.

Si nécessaire, vous pouvez créer un module et inclure le module dans les deux classes, pour le comportement partagé, et supprimer le STI.

+0

La propriété est toujours lisible dans la classe Item en utilisant 'read_attribute (: duration)' ... Le placer dans un module ne semble pas aider puisque l'ActiveRecord trouve "magiquement" les propriétés, pas les classes auto-écrites . – Veger

+0

Peut-être que c'est un cas de mon travail de jour java qui m'influence. Je pense que sans protéger la propriété, un autre développeur pourrait s'attendre à ce que le champ soit utilisé là où il ne l'est pas. Par exemple, ils peuvent créer une vue qui fait référence au champ de description. Bien sûr, sur mon projet ferroviaire actuel, nous ne sommes en réalité que deux et nous communiquons évidemment assez pour que cela ne se produise pas. Il me laisse avec un sentiment de niggling bien, ah bien :) – opsb