/ / Premenné inštancie Ruby verzus atribúty ActiveRecord - ruby-on-rails, ruby, activerecord

Premenné inštancie Ruby v porovnaní s atribútmi ActiveRecord - ruby ​​na koľajniciach, rubín, aktívny záznam

Čítal som, že rubínové objekty sú iba miesta, kde môžeme ukladať premenné inštancií (a ukazovatele tried).

class Person
def initialize(age)
@age = age
end
end

Ak teraz spustíme:

p = Person.new(101)

Potom dostaneme:

#<Person:0x86cf5b8 @age=101>

Skvelé, táto nehnuteľnosť Vek je uložený ako premenná inštancie, podľa očakávania. Ale veci fungujú trochu inak, ak prevádzame model na zdedenie z ActiveRecord. Po vytvorení novej osoby teraz vidíme toto:

# timestamps removed
#<Person id: 1, age: 101 >

Na Vek Vlastnosť sa už nejaví ako premenná inštancie. Čo sa tu teda deje?

Viem, že máme prístup k internetu @attributes inštancia premennej, ktorá obsahuje hash všetkých vlastností a hodnôt, takže som zvedavý, či ActiveRecord pravdepodobne modifikuje výstup konzoly tak, aby prezentoval atribúty objektov týmto spôsobom.

Je možné vytvoriť inštanciu objektu Ruby, v ktorom sú vlastnosti považované za atribúty a nie za premenné inštancie, bez použitia ActiveRecord?

odpovede:

3 pre odpoveď č. 1

Áno, môžete rozšíriť rubínovú triedu pomocou include ActiveModel::AttributeMethods vystaviť premenné vašej inštancie ako ActiveModelpodobné atribúty.

Pozrite si dokumenty Pre viac informácií.


1 pre odpoveď č. 2

ako vidíte vo svojom kóde "ukladanie" vlastností akoNapríklad vars bola vaša práca, takže ak ich chcete držať iným spôsobom, záleží aj na vás. Ruby vám poskytuje metódy triedy pohodlia na definovanie metód getter a setter ako attr_accessor.

tiež stojí za zmienku, že ak zdedíte z ActiveRecord :: Base, nemali by ste prepísať inicializáciu.


0 pre odpoveď č. 3

Zaujímalo by ma, či program ActiveRecord pravdepodobne modifikuje výstup konzoly tak, aby prezentoval atribúty objektov týmto spôsobom.

No tak trochu. Za to je zodpovedná metóda inspect, a implementuje ho Object takým spôsobom, že (baňa Emplasis):

... zobrazuje názov triedy objektu, kódovanie ID objektu a zoznam premenných inštancie a ich hodnoty (zavolaním na kontrolu každého z nich).

Viac je hneď po:

Triedy definované používateľom by mali túto metódu prepísať, aby poskytovali lepšiu reprezentáciu obj.

To je presne to, čo robí ActiveRecord a dôvod, prečo sa tento výstup zobrazuje. Prepísaná metóda neuvádza zoznam premenných inštancie, ale zobrazuje atribúty AR.

Takže len preto, že nevidíte premennú inštancie v konzole, to neznamená, že tam nie je!