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?

Foi útil?

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
scroll top