使用 Rust 的 NEAR 协议中的一对多关系
One to many relationship in NEAR protocol using rust
我正在尝试使用 near_sdk Map and Vector 的一对多关系。
use near_sdk::collections::Map;
use near_sdk::collections::Vector;
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct ProfileDetails {
profileTags: Map<String, IdProducts>,
}
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct Products {
product_name: String,
product_details: String,
}
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct IdProducts {
products: Vector<Products>,
}
对于 Rust 原生集合,它是使用推送方法完成的,例如
let mut hash_map: HashMap<u32, Vec<Sender>> = HashMap::new()
hash_map.entry(3)
.or_insert_with(Vec::new)
.push(sender)
如何使用 near 协议集合进行推送?
#[near_bindgen]
impl ProfileDetails {
pub fn set_profile(&mut self, product_name:String, product_details:String) {
let account_id = env::signer_account_id();
p = Products {
product_name,
product_details
};
self.profileTags.insert(&account_id, ???);
}
}
Solidity 示例在这里:https://ethereum.stackexchange.com/a/39705/56408
首先,你只能在一个代表合约本身的结构上使用#[near_bindgen]。要实现 set_profile
,您可以创建一个带有适当前缀的持久向量(例如 account_id
)。所以它看起来像
let account_id = env::signer_account_id();
p = Products {
product_name,
product_details
};
let mut id_products = Vector::new(account_id.into_bytes());
id_products.push(&p);
self.profileTags.insert(&account_id, &id_products);
如果您的 collection 很小,您也可以使用标准库中的 Vec
。
我正在尝试使用 near_sdk Map and Vector 的一对多关系。
use near_sdk::collections::Map;
use near_sdk::collections::Vector;
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct ProfileDetails {
profileTags: Map<String, IdProducts>,
}
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct Products {
product_name: String,
product_details: String,
}
#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct IdProducts {
products: Vector<Products>,
}
对于 Rust 原生集合,它是使用推送方法完成的,例如
let mut hash_map: HashMap<u32, Vec<Sender>> = HashMap::new()
hash_map.entry(3)
.or_insert_with(Vec::new)
.push(sender)
如何使用 near 协议集合进行推送?
#[near_bindgen]
impl ProfileDetails {
pub fn set_profile(&mut self, product_name:String, product_details:String) {
let account_id = env::signer_account_id();
p = Products {
product_name,
product_details
};
self.profileTags.insert(&account_id, ???);
}
}
Solidity 示例在这里:https://ethereum.stackexchange.com/a/39705/56408
首先,你只能在一个代表合约本身的结构上使用#[near_bindgen]。要实现 set_profile
,您可以创建一个带有适当前缀的持久向量(例如 account_id
)。所以它看起来像
let account_id = env::signer_account_id();
p = Products {
product_name,
product_details
};
let mut id_products = Vector::new(account_id.into_bytes());
id_products.push(&p);
self.profileTags.insert(&account_id, &id_products);
如果您的 collection 很小,您也可以使用标准库中的 Vec
。