Tengo una pregunta sobre cómo debo diseñar mi contrato para lograr lo siguiente: Quiero crear identificadores de productos (pueden ser estructuras o cadenas) algo así como: "producto #123abc". Luego quiero asignarle una estructura (en mi caso, esta estructura contiene información de ubicación) Ejemplo:
struct Location {
string city;
string street;
uint time;}
Y finalmente, quiero asignar varias estructuras de ubicación diferentes a mi producto para poder llamarlo así:
function viewLocation(uint _productID, uint _location) public returns(struct){
return Product[_productID].Location[_location].city;
}
¿También sería posible simplemente llamar al ID del producto y mostrarme todas las ubicaciones asignadas? Algo como esto:
function viewLocation(uint _productID) public returns(array){
return Product[_productID].Location;
}
Si no funciona como lo pienso, ¿cómo sería una solución alternativa? Espero que puedas ayudarme :)
Es posible hacer algo como esto:
struct Location {
string city;
string street;
uint time;
}
struct Product {
uint id;
string name;
mapping (uint => Location) locations;
}
mapping (uint => Product) products;
Entonces las implementaciones serán como:
function viewLocation(uint _productID, uint _location) public returns(struct memory Location){
return products[_productID].locations[_location];
}
Desafortunadamente, las asignaciones simples no se pueden iterar. Pero es posible combinar en una estructura más compleja que se puede iterar, consulte esto para obtener detalles y una implementación https://ethereum.stackexchange.com/a/13168 .
Otra alternativa es mantener separados los lugares y productos. Y mantenga una matriz de ID de ubicación:
struct Product {
uint id;
string name;
uint[] locations;
}
mapping (uint => Product) products;
mapping (uint => Location) locations;
La viewLocation será más compleja:
function viewLocation(uint _productID, uint _location) public returns(struct memory Location){
// Check if _location is in return products[_productID]
// Return locations[_location] if it is present
// Fail otherwise
}