Frage

Ich habe die folgenden

class Item < ActiveRecord::Base
end

class Talk < Item
end

mit der 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

Standardmäßig ist die Beschreibungseigenschaft für den Artikel- und Talkkurse verfügbar. Gibt es eine Möglichkeit, die Immobilie einzuschränken, damit nur der Talksklasse verfügbar ist?

War es hilfreich?

Lösung

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

Sie könnten das immer tun, aber es ist viel Arbeit umsonst. Was ist das Schlimmste, was passieren wird, wenn Sie eine Dauer auf einem Artikel lesen? Sie werden zurückkommen, was kurz danach einen Absturz verursacht. Sie müssen nicht so besorgt über diese Art von Problemen in Ruby sein.

Bei Bedarf können Sie ein Modul erstellen und das Modul in die beiden Klassen für das gemeinsame Verhalten einbeziehen und den STI fallen lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top