Wie fügt man eine Instanz einer Struktur zu einem Array einer anderen hinzu?

Hallo, ich bin ziemlich neu in Solidity. Ich bin mit einem Projekt beschäftigt, das alle möglichen Informationen über Rinder erfasst.

In meinem Code unten enthält meine Rinderstruktur eine Reihe von CattleHealth und CattleGrowth, die Aufzeichnungen über durchgeführte Inspektionen enthalten sollen. Jetzt wollte ich in meinen Funktionen RecordHealth und RecordGrowth die Informationen mit einem Zeitstempel aufzeichnen und als einzelnen Datensatz zum entsprechenden Array hinzufügen.

Mir wurde jedoch klar, dass ich möglicherweise einen großen Fehler gemacht habe, eine Adresse für den Datensatz zu verwenden, da dies die Informationen bei jeder Eingabe überschreibt (korrigieren Sie mich, wenn ich falsch liege). Wie kann ich dann separate Aufzeichnungen hinzufügen und diese mit der richtigen Kuh/dem richtigen Bullen verknüpfen?

contract WagyuRecordContract
{
    address farmer;

    struct Cattle
    {
        address RFID;
        string Name;
        uint256 Weight;
        string Gender;
        string Colour;
        string Breed;
        uint Age; 
        uint DOB;
        string Location;
        bool Parent;
        string SireName;
        string DamName;
        bool Active;
        bool ForSale;
        CattleHealth[] HealthRecord;
        CattleGrowth[] GrowthRecord;
        CattleMovements[] MovementsRecord;
    }

    struct CattleHealth
    {
        uint DateRecorded;
        string BodyCondition;
        string HealthStatus;
        string Medication; 
    }

    struct CattleGrowth
    {
        uint DateRecorded;
        uint256 FoodIntake;
        uint256 Growth;
    }

    struct CattleMovements
    {
        string From;
        string To;
    }

    mapping (address => Cattle) public cattle;
    mapping (address=> CattleHealth) public health;
    mapping (address=> CattleGrowth) public growth;

    modifier Farmer() 
    {
        require(msg.sender == farmer);
        _;
    }

    function addNewCattle(address rfid, string _name, uint _weight, string _gender, string _colour,
    string _breed, uint _age, uint _dob) Farmer public
    {
        cattle[rfid].Name = _name;
        cattle[rfid].Weight = _weight;
        cattle[rfid].Gender = _gender;
        cattle[rfid].Colour = _colour;
        cattle[rfid].Breed = _breed;
        cattle[rfid].Age = _age;
        cattle[rfid].DOB = _dob;
    }

    function NewCattleDetails(address rfid, bool _parent, string _location, string _sireName, string _damName, bool _active, bool _forSale) public Farmer
    {
        cattle[rfid].Parent = _parent;
        cattle[rfid].Location =_location;
        cattle[rfid].SireName = _sireName;
        cattle[rfid].DamName =_damName;
        cattle[rfid].Active = _active;
        cattle[rfid].ForSale = _forSale;
    }

    function RecordHealth(address rfid, string _bodyCond, string _healthStat, uint256, string _med) Farmer public
    {
        health[rfid].DateRecorded = now;
        health[rfid].BodyCondition = _bodyCond;
        health[rfid].HealthStatus = _healthStat;
        health[rfid].Medication = _med;
        cattle[rfid].HealthRecord.push(health[rfid]);
    }

    function RecordGrowth(address rfid, uint256 _foodIntake, uint256 _growth) Farmer public
    {
        growth[rfid].DateRecorded = now;
        growth[rfid].FoodIntake = _foodIntake;
        growth[rfid].Growth = _growth;
        cattle[rfid].GrowthRecord.push(growth[rfid]);
    }
   }

Antworten (1)

Ja, Sie haben Recht, Sie werden nur die letzte Wachstums- und Gesundheitsakte führen. Ich denke, Sie können diese beiden Zeilen entfernen:

mapping (address=> CattleHealth) public health;
mapping (address=> CattleGrowth) public growth;

Erstellen Sie stattdessen einen Datensatz in:

CattleHealth[] HealthRecord;
CattleGrowth[] GrowthRecord;

Methode push()verwenden.