Herança de tabela única: Todas as classes na hierarquia devem ter as mesmas propriedades?
-
20-09-2019 - |
Pergunta
Eu tenho o seguinte
class Item < ActiveRecord::Base
end
class Talk < Item
end
com a migração
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
Por padrão, a propriedade Descrição estará disponível nas classes do item e da conversa. Existe uma maneira de restringir a propriedade para que esteja disponível apenas para a classe Talk?
Solução
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
Você sempre pode fazer isso, mas é muito trabalho por nada. Qual é o pior que acontecerá quando você ler a duração de um item? Você receberá o nil, o que causará um acidente logo em seguida. Você não precisa estar tão preocupado com esses tipos de problemas em Ruby.
Se necessário, você pode criar um módulo e incluir o módulo nas duas classes, para o comportamento compartilhado e soltar o STI.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow